【问题标题】:WPF binding: Bind to parent of DataContextWPF 绑定:绑定到 DataContext 的父级
【发布时间】:2013-02-02 00:05:27
【问题描述】:

好的。这是 WPF,我正在尝试将我的窗口绑定到我的 ViewModel。虚拟机如下所示:

public class VM
{
    public SalesRecord SR {get; set;} 
    public List<string> AllSalesTypes {get; set;}
}

public class SalesRecord
{
    public int ID {get; set;} 
    public DateTime Date {get; set;}
}

这是我的 XAML:

...
<TextBox Text="{Binding Path=ID, Mode=TwoWay}"  />
<TextBox Text="{Binding Path=Date, Mode=TwoWay}"  />
<ComboBox ItemsSource="{Binding AllSalesTypes}" Text="{Binding Path=SalesType, Mode=TwoWay}" />
...

我在运行时将数据上下文设置为 VM 对象,如下所示:

this.DataContext = _vm.SR;

现在绑定表达式适用于我所有指向SR 对象属性的TextBoxes(例如IDDate),但ComboBox 需要显示所有SalesTypes 的列表不起作用,显然是因为AllSalesTypesVM 类的成员。

我的问题是:有没有办法编写一个绑定表达式来查看当前 DataContext 的父级而不是自身?

【问题讨论】:

    标签: wpf mvvm binding viewmodel


    【解决方案1】:

    我不知道有什么方法可以使用 Binding 来获取 DataContext 的父级。
    就像你有一个 A 类,它有一个名为 MyProperty 的属性,然后你写:

     object o = MyAInstance.MyProperty;
    

    您无法从您的o 实例中找到MyAInstance

    您的选择是使用:this.DataContext = _vm 并访问如下属性:

     <TextBox Text="{Binding SR.ID}" />
    

    或将Parent 属性添加到SalesRecord 并手动将其设置为指向虚拟机,这样就可以了:

     <TextBox Text="{Binding ID}" />
     <ComboBox ItemsSource="{Binding Parent.AllSalesTypes}" />
    

    【讨论】:

    • 这是我已经写好的答案,但你已经更快了。但是...当您将 DataContext 设置为 VM 并使用 Text="{Binding SR.ID}" 当您更改 SR PropertyChanged 事件的某些属性时,只有 OneWay 绑定有效。如果要将这些更改传播到 TextBox 的 Text 属性,则必须提高它。但是,是的:)接受我的投票:)
    • @ViktorLaCroix 正确,就像您希望在 UI 中查看更改的任何其他类一样 - SalesRecord 也应该实现 INotifyPropertyChanged
    • 是...或者您可以在 VM 中使用 RaisePropertyChanged("SR")... 也可以:) 而且 SalesRecord 不必实现 INotifyPropertyChanged
    • 谢谢大家。这似乎是唯一的选择。我在考虑 RelativeSource 之类的东西,但看起来这些选项更多的是关于控件而不是数据源。我想我现在会解决 SR.ID 的问题。
    【解决方案2】:

    您最好将视图模型(数据上下文)设为视图模型(因此得名)并将文本框绑定更改为:

    <TextBox Text="{Binding SR.ID}" />
    <TextBox Text="{Binding SR.Date}" />
    

    如果您使用 MVVM,我也强烈建议您使用 MVVM 框架。你真的应该在你的视图模型类型上实现INotifyPropertyChanged - MVVM 框架提供了这个实现。

    【讨论】:

    • 我是 WPF 新手。多年来一直在做这种“Button1_Click”类型的编程,首先是在 VB 中,然后是在 .NET WinForms 中。仅仅几周我就开始 WPF + MVVM + Unity 并且在一个真实世界的项目中也是如此。所以你可以想象曲线对我来说已经很陡了。你认为 MVVM 框架会让我更容易学习吗?如果是,您建议使用哪个框架?
    • 是的,MVVM 框架会让你的生活变得更轻松,尤其是当你的应用程序变得更加复杂时。我会推荐 Caliburn.Micro。 MVVM Light 也很受欢迎,但我会尽快考虑使用其中一个。
    猜你喜欢
    • 2012-11-05
    • 2015-06-27
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 2014-09-22
    相关资源
    最近更新 更多