【发布时间】:2023-03-20 00:53:02
【问题描述】:
我有一个包含以下代码的 MVVM WPF 项目:
MultiplexerVM.cs
public class MultiplexerVM : BaseViewModel
{
public ObservableCollection<MultiplexVM> Multiplexes { get; set; } = new();
public MultiplexVM SelectedMultiplex { get; set; }
public ICommand CheckAll => new CheckBoxCommand(Multiplexes);
}
MultiplexVM.cs
public class MultiplexVM : BaseViewModel
{
public bool IsChecked { get; set; }
}
MultiplexerV.xaml
<UserControl x:Class="MKVStudio.Views.MultiplexerV"
xmlns:vm="clr-namespace:MKVStudio.ViewModels"
xmlns:s="clr-namespace:System;assembly=mscorlib">
<UserControl.Resources>
<s:Boolean x:Key="True">True</s:Boolean>
<s:Boolean x:Key="False">False</s:Boolean>
</UserControl.Resources>
<Grid>
<ListView ItemsSource="{Binding Multiplexes}"
SelectedItem="{Binding SelectedMultiplex}">
<ListView.View>
<GridView>
<GridViewColumn>
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsChecked}"Margin="3"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
...
</GridView>
</ListView.View>
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Command="{Binding CheckAll}"
CommandParameter="{StaticResource True}">
<MenuItem.Header>
<TextBlock Text="Check all"/>
</MenuItem.Header>
</MenuItem>
<MenuItem Command="{Binding CheckAll}"
CommandParameter="{StaticResource False}">
<MenuItem.Header>
<TextBlock Text="Uncheck all"/>
</MenuItem.Header>
</MenuItem>
</ContextMenu>
</ListView.ContextMenu>
</ListView>
</Grid>
</UserControl>
我的目标是将上下文菜单项的IsEnabled 绑定到MultiplexVM.cs 的属性IsChecked。这个想法是实现IValueConverter(将Multiplexes 传递为value 并将布尔值传递为parameter)。转换器返回value.Where(m => m.IsChecked == parameter).Count > 0。本质上,当所有Multiplexes 都未选中时,菜单项Check all 被启用,菜单项Uncheck all 被禁用。当检查所有Multiplexes 时,会发生相反的情况。这里的问题是转换器基本上在声明时只被调用一次,并且检查和取消选中项目并不会触发转换器查看发生了什么。
我尝试实现IMultiValueConverter(但未能正确使用它)并传递三个这样的值:
<MenuItem.IsEnabled>
<MultiBinding>
<Binding Source="{Binding Multiplexes.Count}" />
<Binding Source="{Binding Multiplexes}" />
<Binding Source="{StaticResource True}" /> <!--respectivly False to the other menu item-->
</MultiBinding>
</MenuItem.IsEnabled>
这不起作用。我试过<Binding Path="Multiplexes.Count" /> 和<Binding Path="Multiplexes" />,但还是不行(传递给转换器的值是Unset)。
我使用MultiBinding 的想法是否可行?使用它时我做错了什么?
【问题讨论】:
标签: c# wpf mvvm binding multibinding