2011-03-16 25 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

相关问题