Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 复选框';s IsChecked属性从不更改_C#_Wpf_Checkbox_Imultivalueconverter - Fatal编程技术网

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属性,而不是控件本身。