Свойство IsChecked флажка никогда не изменяется - PullRequest
0 голосов
/ 18 октября 2019

У меня есть TreeView настройка с HierarchialDataTemplate. Это ItemsSource связано с коллекцией Overlay объектов в моей модели представления, где каждый Overlay имеет коллекцию Layer объектов (таким образом, HierarchialDataTemplate). Для каждого Overlay я отображаю CheckBox и Label, которые просто связаны со свойством Overlay Name.

Каждый раз, когда один из флажков установлен /Если этот флажок не установлен, текущие Overlay и свойство IsChecked CheckBox будут отправлены в качестве параметров команды моей модели представления. Я использую MultiValueConverter для их отправки.

Моя проблема в том, что свойство IsChecked CheckBox никогда не меняется. Я попытался использовать оба DataTriggers и установить свойство Command напрямую, но получаю тот же результат.

Ниже приведен связанный .xaml для TreeView. Используется свойство Command.

<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>

Вот версия с использованием DataTriggers:

<TreeView ItemsSource="{Binding OverlaysViewSource}" Name="LayersTreeView">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Layers}" >
            <StackPanel>
                <CheckBox>
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Checked">
                            <i:InvokeCommandAction Command="{Binding DataContext.SetLayersCmd, RelativeSource={RelativeSource AncestorType=UserControl}}" >
                                <i:InvokeCommandAction.CommandParameter>
                                    <MultiBinding Converter="{StaticResource multiValueConverter}">
                                        <Binding RelativeSource="{RelativeSource AncestorType=CheckBox}" />
                                        <Binding/>
                                    </MultiBinding>
                                </i:InvokeCommandAction.CommandParameter>
                            </i:InvokeCommandAction>
                        </i:EventTrigger>
                        <i:EventTrigger EventName="Unchecked">
                            <i:InvokeCommandAction Command="{Binding DataContext.SetLayersCmd, RelativeSource={RelativeSource AncestorType=UserControl}}" >
                                <i:InvokeCommandAction.CommandParameter>
                                    <MultiBinding Converter="{StaticResource multiValueConverter}">
                                        <Binding RelativeSource="{RelativeSource AncestorType=CheckBox}"/>
                                        <Binding />
                                    </MultiBinding>
                                </i:InvokeCommandAction.CommandParameter>
                            </i:InvokeCommandAction>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </CheckBox>
                <Label Content="{Binding Name}" />
            </StackPanel>
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <Label Content="{Binding Name}" />
                    </StackPanel>
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Вот мой MultiValueConverter:

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 никогда не отражает изменения в CheckBox.

...