C# 复选框';s IsChecked属性从不更改
我有一个C# 复选框';s IsChecked属性从不更改,c#,wpf,checkbox,imultivalueconverter,C#,Wpf,Checkbox,Imultivalueconverter,我有一个TreeView设置和一个hierarchicalDataTemplate。它的itemsource绑定到我的viewmodel中的Overlay对象集合,其中每个Overlay都有一个层对象集合(因此层次数据模板)。对于每个覆盖,我将显示一个复选框和一个标签,该标签仅绑定到覆盖的名称属性 <TreeView ItemsSource="{Binding OverlaysViewSource}" Name="LayersTreeView"> <TreeView.I
TreeView
设置和一个hierarchicalDataTemplate
。它的itemsource
绑定到我的viewmodel中的Overlay
对象集合,其中每个Overlay
都有一个层
对象集合(因此层次数据模板
)。对于每个覆盖
,我将显示一个复选框
和一个标签
,该标签仅绑定到覆盖
的名称
属性
<TreeView ItemsSource="{Binding OverlaysViewSource}" Name="LayersTreeView">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Layers}" >
<StackPanel>
<CheckBox IsChecked="True" Command="{Binding DataContext.SetLayersCmd, RelativeSource={RelativeSource AncestorType=UserControl}}">
<CheckBox.CommandParameter>
<MultiBinding Converter="{StaticResource multiValueConverter}">
<Binding RelativeSource="{RelativeSource Self}" />
<Binding />
</MultiBinding>
</CheckBox.CommandParameter>
</CheckBox>
<Label Content="{Binding Name}" />
</StackPanel>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<StackPanel>
<Label Content="{Binding Name}" />
</StackPanel>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
每次选中/取消选中其中一个复选框时,复选框的当前覆盖
和已选中
属性将作为命令参数发送到我的viewmodel。我正在使用一个多值转换器
发送这些数据
我的问题是,复选框的被选中
属性从未更改。我尝试使用DataTriggers
和直接设置命令
属性,但得到了相同的结果
下面是TreeView
的相关.xaml。这使用的是命令
属性
<TreeView ItemsSource="{Binding OverlaysViewSource}" Name="LayersTreeView">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Layers}" >
<StackPanel>
<CheckBox IsChecked="True" Command="{Binding DataContext.SetLayersCmd, RelativeSource={RelativeSource AncestorType=UserControl}}">
<CheckBox.CommandParameter>
<MultiBinding Converter="{StaticResource multiValueConverter}">
<Binding RelativeSource="{RelativeSource Self}" />
<Binding />
</MultiBinding>
</CheckBox.CommandParameter>
</CheckBox>
<Label Content="{Binding Name}" />
</StackPanel>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<StackPanel>
<Label Content="{Binding Name}" />
</StackPanel>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
这是我的多值转换器
:
public class MultiValueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
CheckBox cb = (CheckBox)values[0];
Overlay overlay = (Overlay)values[1];
return new object[] { cb.IsChecked, overlay };
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
我正在检查转换器和视图模型中的命令中的IsChecked
值。它永远不会改变。GUI也从不反映复选框中的更改。如果在Layers对象中放置一个布尔属性,并将其绑定到该属性,该怎么办?然后,您可以在命令中简单地传递层,而不用担心多重绑定。(不要担心投票关闭,有一些连续投票关闭在wpf标签上巡逻的人。)因此Overlay
和Layer
对象是应用程序中广泛使用的第三方对象。我不想为此创建一个新类,但看起来我可能不得不这样做。我只是不明白为什么复选框不会更改。我想知道第一个绑定是否应该是IsChecked属性,而不是控件本身。