我尝试开发一个UserControl
看起来像TextBox
白色的两个不同变化。
首先,如果TextBox
文本值为空,则新的TextBox
必须显示“ PlaceholderText”。我为此实现的解决方案包括第二个TextBox
白色的“ PlaceholderText”作为简单的Text Attribute。最后,我将可见性和焦点更改为其他TextBox
。
当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}" />
有人知道如何解决它吗?我试图将Text属性更改为依赖项属性,但是无法传递TbSource的输入和输出。
答案 0 :(得分:1)
自定义控件的Text
属性(目标属性)必须是依赖项属性,以便您能够在XAML中像这样绑定到它:
<customControl:NiceTextBox ... Text="{Binding Person.Name}" />
但是视图模型中的Person
属性-source属性-不应该定义为依赖项属性。
因此,您在错误的类中定义了依赖项属性。只有将 target 属性定义为依赖项属性,您才能将它们绑定到某些源属性。
控件继承自DependencyObject
类,其中定义了GetValue
和SetValue
方法,但视图模型通常未定义。
答案 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}" />