2013-02-17 236 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