2011-03-16 45 views
0

我有一個類,如:如何綁定到WPF類中的2個不同成員?

class EditorViewModel 
{ 
    public ObservableCollection<Effect> AllEffects; 
    public bool HasPermissions; 
} 

但問題是,當我試圖綁定AllEffectsListView,那麼我不能綁定什麼HasPermissions因爲綁定範圍僅限於AllEffects,不EditorViewModel

我試過,但它不工作:

<ListView ItemsSource="{Binding EditorViewModel}"> 

... 

<GridViewColumn Width="Auto" Header="Name"> 
    <GridViewColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding AllEffects.Name}"/> 
     </DataTemplate> 
    </GridViewColumn.CellTemplate> 
</GridViewColumn> 

<GridViewColumn Width="Auto" Header="Type"> 
    <GridViewColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding AllEffects.Type}"/> 
     </DataTemplate> 
    </GridViewColumn.CellTemplate> 
</GridViewColumn> 

如果我設置ItemsSourceEditorViewModel和擺脫AllEffects,它的工作原理。但我不知道如何通過綁定接入HasPermissions

<GridViewColumn Width="50" Header="Override"> 
    <GridViewColumn.CellTemplate> 
     <DataTemplate> 
      <CheckBox Margin="0" 
            HorizontalAlignment="Center" 
            IsEnabled="{Binding HasPermission}"/> 
     </DataTemplate> 
    </GridViewColumn.CellTemplate> 
</GridViewColumn> 

回答

1

一個經典的技巧是使用ViewModelLocator,請參閱: MVVM Light - using ViewModelLocator - properties hit multiple times

此外,爲更快速和骯髒的解決方案,你可以使用以下綁定:

{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}, Path=DataContext.HasPermissions} 

注意,這將只適用於WPF而不適用於SL,因爲SL不支持RelativeSource的這種語法。

+0

謝謝,我不知道如何使用ViewModelLocator。看起來很先進,不是嗎? – 2011-03-16 22:03:08

+0

它實際上非常簡單..只是谷歌它http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=how+to+use+viewModelLocator – 2011-03-16 22:05:25

+0

謝謝,順便說一句,你知道爲什麼這是複雜的/參與?由於定位器聽起來像是必須找到的東西,但我已經知道它在哪裏,如果WPF有辦法讓我像使用單個成員數據綁定一樣指定。 – 2011-03-16 22:07:27

2

當我更新我的回答on this question包括,你可以ListView控件綁定到視圖模型的AllEffects屬性,然後指的不同屬性ViewModel使用相對進行綁定。因此,假如你的ListView包含在WindowDataContextEditorViewModel,和ListView的的ItemsSource是AllEvents,你仍然可以參考調用hasPermission像這樣:

<CheckBox Margin="0" 
      HorizontalAlignment="Center" 
      IsEnabled="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.HasPermission}"/> 

這有點沉重符號會發現最近的父元素的複選框在Window類型的可視化樹中,並綁定到其DataContext屬性以查找HasPermission。

+0

謝謝,哇,我很驚訝。這是怎麼做到的?所以它不能像我在問題中所展示的那樣完成?我問的原因是MS如果不主要考慮這些情況?或者這是一個角落案件?順便說一句,我不批評你的方法,只是試圖理解它。再次感謝。 – 2011-03-16 22:02:26

+0

我試過你的方法,但它說,路徑不能在類型RelativeSource中找到。是因爲我在窗口頂部有DataContext =「{Binding RelativeSource = {RelativeSource Self}}」嗎? – 2011-03-16 22:05:36

+0

當他們實施WPF開始時,MS真的沒有太多的想到MVVM ..之後它纔來:)只有wpf/silverlight 5纔會針對mvvm。 – 2011-03-16 22:06:28

相關問題