2010-06-07 35 views
7

所以我有一個TreeView,看起來是這樣的:綁定的TreeView選擇到視圖模型

<TreeView Name="elementTreeView" 
         ItemsSource="{Binding Elements}" 
         Width="Auto" 
         SelectedValuePath="Path" /> 

我也有一個TextBlock定義如下:

<TextBlock Text="{Binding ElementName=elementTreeView, Path=SelectedValue}" /> 

我的模型視圖是非常基本的,準確地包含你會期待什麼。我正在尋找的是一種將我的ViewModel中的屬性綁定到SelectedValue的方法。現在,文本塊顯示我需要的東西。有沒有簡單的方法來綁定這個屬性?

+0

不完全確定你在問什麼。你想讓TreeView更新VM的SelectedValue屬性,或者VM的SelectedValue屬性來更新TreeView嗎? – hemp 2010-06-07 20:19:52

+0

對不起,如果我的問題不能理解。我還是WPF的新手。我想讓TreeView更新虛擬機的SelectedValue屬性。我也試圖通過使用綁定來代替SelectedItemChanged事件來正確維護MVVM模式。 – LandonSchropp 2010-06-07 20:30:05

回答

4

所以事實證明,這是不正確地跟隨MVVM模式的結果。解決方案是隻使用一個ViewModel對象。裏面的視圖模型(類型爲ElementViewModel)的對象,我有這樣的事情:

public ElementViewModel Element { 
    get { 
     return this; 
    } 
} 

然後我的TreeView的聲明看起來是這樣的:

<TreeView Name="treeView" 
      ItemsSource="{Binding Elements}" 
      Width="Auto" 
      SelectedValuePath="Element" /> 

在那之後,我所要做的就是綁定我在另一個角度來看Element。

0

您可以使用BindingMode的OneWayToSource將TreeView的SelectedValue屬性綁定到ViewModel。然後使用OneWay綁定將TextBlock的Text屬性綁定到相同的ViewModel屬性。

+0

問題似乎是SelectedValue是隻讀的,所以它不會讓我直接綁定它。 – LandonSchropp 2010-06-07 20:27:10

+0

OneWayToSource綁定模式允許您解決只讀和非依賴屬性;這就是爲什麼我提出這個建議。即使MVVM實施不當,該技術也可以工作。 – hemp 2011-12-09 20:00:19

-1

您可以直接在TreeView控件的屬性綁定您的視圖模型:

這將綁定到虛擬機「的SelectedItem」屬性。

<TreeView Name="elementTreeView" 
        ItemsSource="{Binding Elements}" 
        SelectedValue="{Binding SelectedItem, Mode=OneWayToSource}" 
        Width="Auto" 
        SelectedValuePath="Path" /> 
+0

當我嘗試這樣做時,出現以下構建錯誤: 'SelectedValue'屬性爲只讀屬性,不能從標記中設置。 – LandonSchropp 2010-06-07 20:25:54

+0

@ helixed:對不起 - 它應該是單向源 – 2010-06-07 20:27:26

+0

這仍然導致綁定錯誤。 – Justin 2010-12-17 23:49:00