1

我的文件后面的代码具有其相应的视图模型作为我的一个 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(...);
    }
}
4

1 回答 1

1

您的错误消息告诉您在ViewModel上找不到该属性Grid 'grdProd',这是一个公平的观点,因为您是在您的类Viewmodel上定义的公共属性。ProductInfoWindow

尝试将其设置DatacontextWindow级别(适应您的示例):

<Window DataContext="{Binding RelativeSource={RelativeSource Self}, Path=ViewModel}" ...>
    <Grid Name="grdProd"> 
        <TextBox Name="txtName" Text="{Binding Product.Name}" />
    </Grid>
</Window>
于 2013-08-08T15:31:07.793 回答