我有一个绑定到ObservableCollection的控制项组。如果将项目设置为TextBlock,则每个项目的ItemTemplate都有效:
<DataTemplate x:Key="SampleTemplate">
<TextBlock Text="{Binding FirstName}"/>
</DataTemplate>
我在其中创建了一个带有TextBlock的用户控件。我想将上面的“FirstName”传递给用户控件。我试图通过在后面的用户控制代码中定义DependencyProperty来执行此操作:
public static DependencyProperty SomeValueProperty = DependencyProperty.Register(
"SomeValue",
typeof(Object),
typeof(SampleControl));
public string SomeValue
{
get
{
return (string)GetValue(SomeValueProperty);
}
set
{
(this.DataContext as UserControlViewModel).Name = value;
SetValue(SomeValueProperty, value);
}
在MainWindow的ItemTemplate中,我将其更改为:
<DataTemplate x:Key="SampleTemplate">
<local:SampleControl SomeValue="{Binding FirstName}"/>
</DataTemplate>
但这不起作用。我不确定为什么这个Binding失败,当相同的Binding适用于MainWindow中的TextBlock。我在这里做错了什么?
答案 0 :(得分:1)
我可以看到很多错误,可能是这些事情中的任何一个打破了这个:
public static DependencyProperty SomeValueProperty = DependencyProperty.Register(
"SomeValue", typeof(String), typeof(SampleControl),
new FrameworkPropertyMetaData(new PropertyChangedCallback(OnSomeValueChanged)));
private static void OnSomeValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((d as SampleControl).DataContext as UserControlViewModel).Name = e.NewValue;
}
public string SomeValue
{
get
{
return (string)GetValue(SomeValueProperty);
}
set
{
SetValue(SomeValueProperty, value);
}
}
注意我使用的是String
,而不是Object
。并且,在PropertyChangedCallBack
中更改值的额外工作。并且,我只在SomeValue
POCO中执行基础知识,因为真正的工作是在SetValue
中完成的。另外值得注意的是,我没有做任何异常处理,这也可能是你的错误...如果你当前代码中的.Name
调用失败,那么SetValue
永远不会出现