1

我正在制作用于输入各种业务实体(客户等)的主数据的 UI。我经常需要将 TextBlock 和 TextBox 组合在一起。IE

<Label Content="Civil Status:" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" />
<TextBox Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="3" Name="civilStatusTextBox" Text="{Binding Path=CivilStatus, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" VerticalAlignment="Center" Width="120" />
<Label Content="Company:" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" />
<TextBox Grid.Column="1" Grid.Row="2" Height="23" HorizontalAlignment="Left" Margin="3" Name="companyTextBox" Text="{Binding Path=Company, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" VerticalAlignment="Center" Width="120" />

有什么方法可以减少打字吗?IE

<custom:LabeledTextBox Label="Civil Status:" Text="{Binding Path=CivilStatus, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" ... />

或者可能,任何提供类似功能的库?

编辑:暂时忘记容器Grid并假设它是 StackPanel。

4

2 回答 2

2

这是我设法整理的分步解决方案。为了做好准备,我假设我们有一个非常简单的 UserControl,它具有以下XAML内容。

<UserControl x:Class="WpfApplication2.UserControl1" [ ... auto gen code removed ... ] >
     <TextBox MinWidth="50" x:Name="TBox" />        
</UserControl>

XAML使用我们的 UserControl 我们本质上想为Texton 的属性设置数据绑定TBox。理想情况下,我们可以使用简单的语法,例如:

<local:UserControl1 TBox.Text="{Binding ...}" />

不幸的是,我不知道任何允许定位子元素属性的 XAML 语法,所以下一个最好的方法是在 UserControl 本身中引入一个“暂存”属性并通过它进行绑定。

由于 Binding 仅适用于 Dependency 属性,因此我们将介绍的属性必须是DependencyProperty. 我们还将直接从代码中将Text属性绑定到我们的 DependencyProperty。TBox

UserControl 的代码隐藏如下所示:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();

            // Set binding from code
            this.TBox.DataContext = this;
            this.TBox.SetBinding(TextBox.TextProperty, new Binding { Path = new PropertyPath("TBValue"), Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
        }

        public static readonly DependencyProperty TBValueProperty = DependencyProperty.Register("TBValue", typeof(string), typeof(UserControl1));

        public string TBValue
        {
            get { return this.GetValue(TBValueProperty) as string; }
            set { this.SetValue(TBValueProperty, value); }
        }
    }
}

有了这个,我们可以像这样使用 UserControl,绑定到TBValue属性:

<local:UserControl1 TBValue="{Binding Path=Test, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
于 2013-03-08T08:32:29.080 回答
0

您想要实现的目标(Master-Detail-Views)实际上得到了 Visual Studio 开箱即用的良好支持。打开以下菜单结构:Project -> Add Data Source,然后选择数据源类型Object。在下文中,选择要为其生成输入字段的类并完成向导。

在此处输入图像描述

然后,如果尚未打开,请打开您的数据源工具窗口(Shift+Alt+D)。您应该会看到刚刚生成的类型的 DataSource。要为对象的每个属性获取标签字段,请打开源下拉列表并单击Details

在此处输入图像描述

请注意,属性也有这样的下拉菜单,因此您可以选择编辑它们的方式(组合框、文本框、自定义、无编辑器......)。现在只需将 DataSource 拖到您的窗口上。您将获得一个 Grid ,其中填充了您想要的所有标签和编辑器。DataBinding 和验证也立即得到支持,因此您只需设置生成的 Grid 的DataContext.

希望这可以为您节省一些工作。

PS屏幕截图是在我的德语 VS 实例中制作的,但我认为它们可能会帮助您识别正确的对话/窗口。

于 2013-03-08T07:03:33.823 回答