我在WPF中创建了一个自定义控件,但我无法正确绑定它。如果我在后面的代码中明确设置了属性的值,那么一切正常。
这是我控制范围内TextBox
的XAML:
<TextBox Name="txtText" Grid.Row="0" Grid.Column="0" IsReadOnly="True" Text="{Binding Text, Mode=OneWay}" />
后面代码中的相关属性如下:
public static readonly DependencyProperty TextConverterProperty = DependencyProperty.Register("TextConverter", typeof(IValueConverter), typeof(Selector));
public static readonly DependencyProperty EntityIdProperty = DependencyProperty.Register("EntityId", typeof(long), typeof(Selector));
public string Text
{
get
{
string result = this.EntityId.ToString();
if (this.TextConverter != null)
{
result = this.TextConverter.Convert(result, null, null, null) as string;
}
return result;
}
}
public long EntityId
{
get
{
return (long)this.GetValue(EntityIdProperty);
}
set
{
this.SetValue(EntityIdProperty, value);
this.OnPropertyChanged("Text");
this.OnPropertyChanged("EntityId");
}
}
public IValueConverter TextConverter
{
get
{
return this.GetValue(TextConverterProperty) as IValueConverter;
}
set
{
this.SetValue(TextConverterProperty, value);
}
}
现在我的页面中的XAML实现:
<controls:Selector x:Name="txtReferringCase" EntityId="{Binding ReferringDACaseId}" TextConverter="{StaticResource daCaseNumberConverter}" Grid.Column="5" Grid.Row="0" Grid.ColumnSpan="3" ButtonClicked="txtReferringCase_ButtonClicked" />
现在这是奇怪的部分。我可以为页面设置DataContext但没有任何反应,但是当我取消注释注释行时,文本显示在我的用户控件中没有问题:
_caseScreen = new DACaseScreen(itemId);
this.DataContext = _caseScreen;
//this.txtReferringCase.EntityId = _caseScreen.ReferringDACaseId;
编辑:我忘了提到的另一件事......如果我点击断点并检查控件的EntityId和Text属性,它们都会显示我期望的值。看起来UI似乎没有更新。
答案 0 :(得分:1)
DependencyProperties的getter和Setters只应调用GetValue
和SetValue
,因为XAML不会使用它们,只是为了方便起见。如果你想要额外的行为,请注册你的DependencyProperty
传递一个你想做的改变处理程序。
public static readonly DependencyProperty EntityIdProperty = DependencyProperty.Register("EntityId", typeof(long), typeof(Selector),new UIPropertyMetadata(EntityIdChanged));
public long EntityId
{
get
{
return (long)this.GetValue(EntityIdProperty);
}
set
{
this.SetValue(EntityIdProperty, value);
}
}
private static void EntityIdChanged(object sender, DependencyPropertyChangedEventArgs e)
{
var control = (Selector)sender;
control.OnPropertyChanged("Text");
}
您无需为依赖项属性调用PropertyChanged
。我还需要更改UserControl
中的txtText绑定,将源设置为控件本身而不是DataContext
,但如果在代码中设置属性,则应该没问题。您可能希望重命名控件,因为有一个名为Selector的内置控件,但它并不重要。
答案 1 :(得分:0)
在进行OnPropertyChanged
通话之前,您的用户界面不会更新。设置DataContext
不会解雇此问题。
另外你做了:
public static readonly DependencyProperty TextConverterProperty = DependencyProperty.Register("TextConverter", typeof(IValueConverter), typeof(Selector));
public static readonly DependencyProperty EntityIdProperty = DependencyProperty.Register("EntityId", typeof(long), typeof(Selector));
但是你没有注册Text依赖项,只注册TextConverter
和EntityId。意思是,你的OnPropertyChanged
不起作用(?)(或者你只是忘了在这里显示那条线:))