WPF绑定:绑定到DataContext的父级

3

好的。这是关于WPF技术的内容,我正在尝试将我的窗口绑定到我的ViewModel。VM看起来像这样:

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对象属性(例如ID和日期)的文本框,但需要显示所有销售类型列表的ComboBox无法工作,显然是因为AllSalesTypes是VM类的成员。
我的问题是: 是否有一种方法可以编写一个绑定表达式,它查找当前DataContext的父级而不是自身?
2个回答

2

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

 object o = MyAInstance.MyProperty;

你没有办法从你的实例 o 中找到MyAInstance
你的选择是使用:this.DataContext = _vm 并像这样访问属性:
 <TextBox Text="{Binding SR.ID}" />

或者在SalesRecord中添加一个Parent属性,并手动将其设置为指向VM,然后可以使用以下代码:

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

1
这是我已经写好的答案,但你更快了。但是... 当你将DataContext设置为VM并使用Text =“{Binding SR.ID}”时,只有OneWay绑定在更改SR的某些属性时不会引发PropertyChanged事件。如果您想将这些更改传播到TextBox的Text属性,则必须引发它。但是,是的 :) 给你点赞 :) - Kapitán Mlíko
@ViktorLaCroix 正确,就像您想要在 UI 中看到更改的任何其他类一样 - SalesRecord 也应该实现 INotifyPropertyChanged。 - Blachshma
是的...或者你可以在VM中调用RaisePropertyChanged("SR")...也可以 :) 而SalesRecord不必实现INotifyPropertyChanged。 - Kapitán Mlíko
1
谢谢大家。这似乎是唯一的选择。我曾考虑过RelativeSource之类的东西,但看起来这些选项更多地涉及控件而不是数据源。我想现在我只能暂时使用SR.ID了。 - dotNET

0
最好将视图的模型(数据上下文)作为视图模型(因此得名),并将文本框绑定更改为:
<TextBox Text="{Binding SR.ID}" />
<TextBox Text="{Binding SR.Date}" />

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

我是一个WPF新手。多年来一直在做那种“Button1_Click”类型的编程,先是用VB,然后是.NET WinForms。只有几周时间我才开始接触WPF + MVVM + Unity,并且还是在一个真实的项目中。所以你可以想象对我来说曲线已经很陡峭了。你认为MVVM框架会让我的学习更容易吗?如果是的话,你建议使用哪个框架? - dotNET
1
是的,一个MVVM框架会让你的生活变得更轻松,特别是当你的应用程序变得更加复杂时。我推荐使用Caliburn.Micro。MVVM Light也非常受欢迎,但我建议尽早使用其中之一。 - devdigital

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接