我有一个类:
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>
答案 0 :(得分:2)
当我更新我的答案on this question以包含时,您可以将ListView绑定到ViewModel的AllEffects属性,然后使用 relative 绑定引用ViewModel的其他属性。因此,假设您的ListView包含在Window
DataContext
为EditorViewModel
,而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的这种语法。