WPF自定义UserControl-属性绑定

时间:2018-06-29 09:38:30

标签: c# wpf binding

我尝试开发一个UserControl看起来像TextBox白色的两个不同变化。

  1. 首先,如果TextBox文本值为空,则新的TextBox必须显示“ PlaceholderText”。我为此实现的解决方案包括第二个TextBox白色的“ PlaceholderText”作为简单的Text Attribute。最后,我将可见性和焦点更改为其他TextBox

  2. 当Textbox ValidationResult对象返回false时,它们将显示TextBlock白色和“ ErrorMessage”

它们的两个实现已经在起作用并且存在。对于我的新TextBox,我将所有TextBox个特定的属性复制到了我的新控件中,并将它们传递给原始的TextBox

现在,我尝试将新控件的Text属性绑定到DependencyPropery对象(在ViewModel中)。

我的实现看起来像这样:

自定义文本框文本属性

public string Text
{
    get => TbSource.Text;
    set => TbSource.Text = value;
}

ViewModel属性

public static DependencyProperty PersonProperty =
DependencyProperty.Register(nameof(Person), typeof(Person), typeof(PersonViewModel));

public Person Person
{
    get => (Person)GetValue(PersonProperty);
    set => SetValue(PersonProperty, value);
}

我的观点

<customControl:NiceTextBox Grid.Row="0" Grid.Column="1" IsPlaceholderAktive="True" PlaceholderText="Enter first name" ErrorMessage="The given first name isn't valid." Text="{Binding Person.Name}" />

现在在“视图”中的实现中,我成为关注消息:enter image description here

有人知道如何解决它吗?我试图将Text属性更改为依赖项属性,但是无法传递TbSource的输入和输出。

2 个答案:

答案 0 :(得分:1)

自定义控件的Text属性(目标属性)必须是依赖项属性,以便您能够在XAML中像这样绑定到它:

<customControl:NiceTextBox ... Text="{Binding Person.Name}" />

但是视图模型中的Person属性-source属性-不应该定义为依赖项属性。

因此,您在错误的类中定义了依赖项属性。只有将 target 属性定义为依赖项属性,您才能将它们绑定到某些源属性。

控件继承自DependencyObject类,其中定义了GetValueSetValue方法,但视图模型通常未定义。

答案 1 :(得分:0)

将您的UserControl Text属性设置为DependencyProperty,并将ViewModel中的属性设置为常规CLR属性,并将其绑定。

UserControl

public string Text
{
    get { return (string)GetValue(TextProperty); }
    set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty TextProperty =
       DependencyProperty.Register("Text", typeof(string), typeof(NiceTextBox), new PropertyMetadata(string.Empty));

ViewModel

public Person Person { get; set; }

XAML

<customControl:NiceTextBox ... Text="{Binding Person.Name}" />