我决定在视图模型中尝试使用绑定依赖项属性。为此,我设置了一个简单的测试项目,包括一个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,但我究竟在哪里弄错了?
答案 0 :(得分:1)
将视图中的目标属性绑定到DataContext的源属性。视图模型是DataContext,即它定义了源属性。它没有被添加到可视树中,因此您不能将BoundString依赖项属性用作ListBox的SelectedItem属性的目标属性。
通常,视图模型中的源属性被定义为CLR属性,而目标属性(即绑定到的属性)必须定义为依赖项属性。有关此内容的更多信息,请参阅以下问题: