我试图在一个使用C#的小型WPF项目中使用MVVM原则。我有一个ListBox,其中填充了通过绑定回ViewModel创建的CheckBoxes。我还有一个绑定到CheckBoxes的命令,希望将CheckBoxes Content作为CommandParameter传递。我在找这样的东西:
<Binding ElementName="" Path="Content"/>不幸的是,由于CheckBoxes是通过绑定创建的,所以我没有元素名。
ListBox / ListBoxItem Style的代码如下:
<Style x:Key="CheckBoxListStyle" TargetType="{x:Type ListBox}">
<Setter Property="SelectionMode" Value="Multiple"></Setter>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="{x:Type ListBoxItem}" >
<Setter Property="Margin" Value="2" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<CheckBox Command="{Binding SelectedItemCommand, Mode=OneWay, Source={StaticResource comd}}">
<CheckBox.CommandParameter>
<MultiBinding Converter="{StaticResource cv}">
<Binding ElementName="" Path="Content"/>
<Binding ElementName="" Path="IsChecked"/>
</MultiBinding>
</CheckBox.CommandParameter>
<ContentPresenter></ContentPresenter>
</CheckBox>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
</Style>它的实施是:
<ListBox Grid.Row="1" Style="{StaticResource CheckBoxListStyle}" Name="lstProducts" ItemsSource="{Binding stampInfo, Mode=OneWay, Source={StaticResource vmStamp}}"
DisplayMemberPath="Country" >
</ListBox>最终,我的目标是能够在文本框中显示所有选定项目的文本Contents (本例中的国家),如果每个国家用逗号分隔。我目前唯一缺少的是Country。
发布于 2021-12-14 17:10:56
当您真正想要以不同的方式显示数据项时,不要为ListBoxItem创建一个DataTemplate,而是使用DataTemplate,这正是它的目的。见数据模板概述。
从DisplayMemberPath中删除ListBox,因为您不能同时使用路径和自定义DataTemplate。只有在没有DataTemplate的情况下,才会设置此路径,但希望指定要显示的具体属性或属性路径。
<ListBox Grid.Row="1"
Style="{StaticResource CheckBoxListStyle}" Name="lstProducts"
ItemsSource="{Binding stampInfo, Mode=OneWay, Source={StaticResource vmStamp}}"/>将ControlTemplate替换为DataTemplate作为ItemTemplate。然后将Content和CommandParameter绑定到属性Country。数据上下文自动设置为绑定数据项集合中的相应项。IsChecked属性可以使用RelativeSource绑定,这是CheckBox本身。
<Style x:Key="CheckBoxListStyle" TargetType="{x:Type ListBox}">
<Setter Property="SelectionMode" Value="Multiple"></Setter>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="{x:Type ListBoxItem}" >
<Setter Property="Margin" Value="2" />
</Style>
</Setter.Value>
</Setter>
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<CheckBox Content="{Binding Country}"
Command="{Binding SelectedItemCommand, Mode=OneWay, Source={StaticResource comd}}">
<CheckBox.CommandParameter>
<MultiBinding Converter="{StaticResource cv}">
<Binding Path="Country"/>
<Binding Path="IsChecked" RelativeSource="{RelativeSource Self}"/>
</MultiBinding>
</CheckBox.CommandParameter>
</CheckBox>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>另一个不同的选项是创建具有可以绑定到IsChecked属性CheckBox的属性的数据项。然后,您可以在数据项的setter中执行操作,或者在例如执行命令的按钮单击上执行操作,该命令将筛选视图模型中的绑定集合以获取选中的项。
https://stackoverflow.com/questions/70351671
复制相似问题