自定义DependencyProperty不绑定到ElementName

时间:2017-02-02 09:15:12

标签: c# wpf xaml binding

我决定在视图模型中尝试使用绑定依赖项属性。为此,我设置了一个简单的测试项目,包括一个MainWindow.xaml:

public class ViewModel2 : DependencyObject
{
    public string BoundString
    {
        get { return (string)GetValue(BoundStringProperty); }
        set { SetValue(BoundStringProperty, value); }
    }

    // Using a DependencyProperty as the backing store for BoundString.
    public static readonly DependencyProperty BoundStringProperty =
        DependencyProperty.Register("BoundString", typeof(string), typeof(ViewModel2), 
            new FrameworkPropertyMetadata(default(string),
                FrameworkPropertyMetadataOptions.BindsTwoWayByDefault ));
}

并由简单的视图模型对象备份:

ListBox.SelectedItem

现在,我希望在ListBox中选择一些内容后,文本框的内容会发生变化。但是,当我运行程序时,似乎DataBinding找不到ListBox:

  

System.Windows.Data警告:56:为绑定创建BindingExpression(hash = 61931053)(hash = 40205895)

     

System.Windows.Data警告:58:路径:' SelectedItem'

     

System.Windows.Data警告:60:BindingExpression(hash = 61931053):默认模式已解析为TwoWay

     

System.Windows.Data警告:61:BindingExpression(hash = 61931053):解析为PropertyChanged的默认更新触发器

     

System.Windows.Data警告:62:BindingExpression(hash = 61931053):附加到MVVM_Test.ViewModel2.BoundString(hash = 64815892)

     

System.Windows.Data警告:64:BindingExpression(hash = 61931053):使用框架导师

     

System.Windows.Data警告:67:BindingExpression(hash = 61931053):解析源

     

System.Windows.Data警告:69:BindingExpression(hash = 61931053):找不到框架导师

     

System.Windows.Data警告:65:BindingExpression(hash = 61931053):解析源延迟

延迟查找会持续一点直到达到这一点:

  

System.Windows.Data警告:67:BindingExpression(hash = 61931053):解析来源(最后机会)

     

System.Windows.Data警告:69:BindingExpression(hash = 61931053):找不到框架导师

     

System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。 BindingExpression:路径=的SelectedItem;的DataItem = NULL;目标元素是' ViewModel2' (的HashCode = 64815892); target属性是' BoundString' (键入' String')

如果我以相反的方式进行绑定,例如从<ListBox Margin="6" Grid.RowSpan="2" Name="PART_LISTBOX" SelectedItem="{Binding ElementName=PART_spViewModel2, Path=DataContext.BoundString}"> 属性到ViewModel它可以工作。

{{1}}

所以我的猜测是我没有正确设置DependencyProperty,但我究竟在哪里弄错了?

1 个答案:

答案 0 :(得分:1)

将视图中的目标属性绑定到DataContext的属性。视图模型是DataContext,即它定义了源属性。它没有被添加到可视树中,因此您不能将BoundString依赖项属性用作ListBox的SelectedItem属性的目标属性。

通常,视图模型中的源属性被定义为CLR属性,而目标属性(即绑定到的属性)必须定义为依赖项属性。有关此内容的更多信息,请参阅以下问题:

Can somone give example of Dependency Property in ViewModel

INotifyPropertyChanged vs. DependencyProperty in ViewModel