如何在WPF中绑定到类中的2个不同成员?

时间:2011-03-16 21:46:28

标签: c# .net wpf listview

我有一个类:

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

但问题是,当我尝试将AllEffects绑定到ListView时,我无法将任何内容绑定到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>

如果我将ItemsSource设置为EditorViewModel并摆脱AllEffects,则可行。但后来我不知道如何通过绑定访问HasPermissions

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

2 个答案:

答案 0 :(得分:2)

当我更新我的答案on this question以包含时,您可以将ListView绑定到ViewModel的AllEffects属性,然后使用 relative 绑定引用ViewModel的其他属性。因此,假设您的ListView包含在Window DataContextEditorViewModel,而ListView的ItemsSource为AllEvents,您仍然可以像这样引用HasPermission:

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

这种有点笨重的符号将在可视树中找到最接近CheckBox的父元素,它是Window类型,并绑定到其DataContext属性以查找HasPermission。

答案 1 :(得分:1)

一个经典的技巧是使用ViewModelLocator,请参阅: MVVM Light - using ViewModelLocator - properties hit multiple times

另外,对于更快速和肮脏的解决方案,您可以使用以下绑定:

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

请注意,这只适用于WPF而不适用于SL,因为SL不支持RelativeSource的这种语法。