WPF - 绑定失败到用户控件依赖项属性

时间:2014-01-15 02:38:45

标签: wpf dependency-properties

我有一个绑定到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。我在这里做错了什么?

1 个答案:

答案 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永远不会出现