在命令参数中发送当前项目和复选框值
Send current Item and checkbox value in command parameters
我有一个 TreeView
设置 HierarchialDataTemplate
。它的 ItemsSource
绑定到我的视图模型中的 Overlay
个对象的集合,其中每个 Overlay
都有一个 Layer
个对象的集合(因此 HierarchialDataTemplate
)。对于每个 Overlay
,我显示一个 CheckBox
和一个 Label
,它们简单地绑定到 Overlay
的 Name
属性。
我想做的是,每次其中一个复选框是 checked/unchecked,当前 Overlay
和 IsChecked
属性 19=] 将作为命令参数发送到我的视图模型。
如果我不使用 MultiValueConverter
,我可以发送其中一个属性。但我需要将两者都作为参数发送。
下面是树视图的相关内容。xaml。我只展示了必要的部分和 Checked
触发器,因为 Unchecked
完全相同:
<TreeView ItemsSource="{Binding OverlaysViewSource}" Name="LayersTreeView">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Layers}" >
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="True">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked">
<i:InvokeCommandAction Command="{Binding DataContext.SetVisibilityCmd, RelativeSource={RelativeSource AncestorType=UserControl}}" >
<i:InvokeCommandAction.CommandParameter>
<MultiBinding Converter="{StaticResource multiValueConverter}">
<Binding Path="IsChecked, RelativeSource={RelativeSource AncestorType=CheckBox}" />
<Binding/>
</MultiBinding>
</i:InvokeCommandAction.CommandParameter>
</i:InvokeCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</CheckBox>
<Label Content="{Binding Name}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
因此在 MultiBinding
中,第一个:<Binding Path="IsChecked, RelativeSource={RelativeSource AncestorType=CheckBox}" />
尝试发送复选框的 IsChecked
属性。但是,我在命令中得到的值是 DependencyProperty.UnsetValue
.
第二个仅用于当前 Overlay
项目,但整个 TreeView
将作为参数发送。
更新:
Overlay
class 是第三方控件,用在很多地方我没法修改。所以我不能只添加一个 属性 到它。
更新 2:我已经设法让 Overlay
正确发送。现在只需要 IsChecked
属性。
IsChecked
的绑定应该使用 {RelativeSource Self}
,因为绑定是通过 Style
应用于 CheckBox
。
您对问题的更新表明您已经解决了另一个问题。
我有一个 TreeView
设置 HierarchialDataTemplate
。它的 ItemsSource
绑定到我的视图模型中的 Overlay
个对象的集合,其中每个 Overlay
都有一个 Layer
个对象的集合(因此 HierarchialDataTemplate
)。对于每个 Overlay
,我显示一个 CheckBox
和一个 Label
,它们简单地绑定到 Overlay
的 Name
属性。
我想做的是,每次其中一个复选框是 checked/unchecked,当前 Overlay
和 IsChecked
属性 19=] 将作为命令参数发送到我的视图模型。
如果我不使用 MultiValueConverter
,我可以发送其中一个属性。但我需要将两者都作为参数发送。
下面是树视图的相关内容。xaml。我只展示了必要的部分和 Checked
触发器,因为 Unchecked
完全相同:
<TreeView ItemsSource="{Binding OverlaysViewSource}" Name="LayersTreeView">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Layers}" >
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="True">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked">
<i:InvokeCommandAction Command="{Binding DataContext.SetVisibilityCmd, RelativeSource={RelativeSource AncestorType=UserControl}}" >
<i:InvokeCommandAction.CommandParameter>
<MultiBinding Converter="{StaticResource multiValueConverter}">
<Binding Path="IsChecked, RelativeSource={RelativeSource AncestorType=CheckBox}" />
<Binding/>
</MultiBinding>
</i:InvokeCommandAction.CommandParameter>
</i:InvokeCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</CheckBox>
<Label Content="{Binding Name}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
因此在 MultiBinding
中,第一个:<Binding Path="IsChecked, RelativeSource={RelativeSource AncestorType=CheckBox}" />
尝试发送复选框的 IsChecked
属性。但是,我在命令中得到的值是 DependencyProperty.UnsetValue
.
第二个仅用于当前 Overlay
项目,但整个 TreeView
将作为参数发送。
更新:
Overlay
class 是第三方控件,用在很多地方我没法修改。所以我不能只添加一个 属性 到它。
更新 2:我已经设法让 Overlay
正确发送。现在只需要 IsChecked
属性。
IsChecked
的绑定应该使用 {RelativeSource Self}
,因为绑定是通过 Style
应用于 CheckBox
。
您对问题的更新表明您已经解决了另一个问题。