我的文件后面的代码具有其相应的视图模型作为我的一个 Windows 的公共属性。我尝试将我的 ViewModel 与 XAML 中的 UI 元素数据绑定,但我总是收到错误消息。但是,当我尝试使用代码创建数据绑定时,它可以正常工作。我真的很困惑为什么会发生这种情况,并希望得到一些关于我做错了什么的指导。
场景 1 - 在 xaml 中完成数据绑定失败
ProductInfoWindow.xaml:
<Window ...>
<Grid Name="grdProd" DataContext="{Binding RelativeSource={RelativeSource Self}, Path=ViewModel}">
<TextBox Name="txtName" Text="{Binding Product.Name}" />
</Grid>
</Window>
ProductInfoWindow.xaml.cs:
public partial class ProductInfoWindow : Window
{
public ProductInfoViewModel ViewModel { get; set; }
public ProductInfo()
{
ViewModel = new ProductInfoViewModel(...);
}
}
输出窗口中的错误消息:
System.Windows.Data Error: 40 : BindingExpression path error: 'ViewModel' property not
found on 'object' ''Grid' (Name='grdProd')'. BindingExpression:Path=ViewModel;
DataItem='Grid' (Name='grdProd'); target element is 'Grid' (Name='grdProd'); target
property is 'DataContext' (type 'Object')
场景 2 - 在代码中完成数据绑定工作
ProductInfoWindow.xaml:
<Window ...>
<Grid Name="grdProd">
<TextBox Name="txtName" Text="{Binding Product.Name}" />
</Grid>
</Window>
ProductInfoWindow.xaml.cs:
public partial class ProductInfoWindow : Window
{
public ProductInfoViewModel ViewModel { get; set; }
public ProductInfo()
{
ViewModel = new ProductInfoViewModel(...);
grdProd.DataContext = ViewModel;
}
}
编辑 (09/08/2013)
ProductInfoViewModel.cs
public class ProductInfoViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, e);
}
private Product m_product;
public Product Product
{
get
{
return m_product;
}
set
{
m_product = value;
OnPropertyChanged(new PropertyChangedEventArgs("Product"));
}
}
public ProductInfoViewModel(...)
{
Product = new Product(...);
}
}