2013-02-17 118 views
3

OK。这是WPF,我试图将我的窗口绑定到ViewModel。虚拟机看起来是这样的:WPF绑定:绑定到DataContext的父代

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}" /> 
... 

我在运行时设置数据上下文的​​对象是这样的:

this.DataContext = _vm.SR; 

现在结合表达式适用于指向SR对象(例如IDDate)的属性的所有我的TextBoxes,bu t ComboBox需要显示所有SalesType的列表不起作用,显然是因为AllSalesTypes是​​类的成员。

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

回答

2

我不知道你有什么办法可以使用Binding来获得DataContext的Parent。
就像如果你有一类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}" /> 
+1

这是我已经写过的答案,但你的速度更快。但是...当您将DataContext设置为VM并使用Text =“{Binding SR.ID}”时,如果更改SR的某些属性,则不会引发PropertyChanged事件。如果要将这些更改传播到TextBox的Text属性,则必须提高它。但是是的:)拿起我的赞同:) – 2013-02-17 13:55:08

+0

@ViktorLaCroix正确的,就像任何其他类你想在UI中看到变化 - SalesRecord也应该实现INotifyPropertyChanged – Blachshma 2013-02-17 14:22:04

+0

是的......或者你可以RaisePropertyChanged(“SR”)在虚拟机...也工作:)和SalesRecord不必实施INotifyPropertyChanged – 2013-02-17 14:23:59

0

你最好不要让您的视图模型(数据上下文)的视图模型(因此得名),并改变你的文本框绑定:

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

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

+0

我是WPF新手。花了多年和几年的时间来做这个“Button1_Click”类的编程,首先在VB中,然后在.NET WinForms中。仅仅几个星期,我就开始了WPF + MVVM + Unity,并且这也是一个真实世界的项目。所以你可以想象这条曲线对我来说已经很陡。你认为MVVM框架会让我的学习更容易吗?如果是的话,你建议哪个框架? – dotNET 2013-02-17 16:29:29

+1

是的MVVM框架会让你的生活变得更轻松,特别是当你的应用变得更加复杂时。我会推荐Caliburn.Micro。 MVVM Light也非常受欢迎,但我会尽早使用其中一种。 – devdigital 2013-02-17 16:53:36