首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >中继命令命令参数

中继命令命令参数
EN

Stack Overflow用户
提问于 2021-12-14 15:46:36
回答 1查看 125关注 0票数 0

我试图在一个使用C#的小型WPF项目中使用MVVM原则。我有一个ListBox,其中填充了通过绑定回ViewModel创建的CheckBoxes。我还有一个绑定到CheckBoxes的命令,希望将CheckBoxes Content作为CommandParameter传递。我在找这样的东西:

代码语言:javascript
复制
<Binding ElementName="" Path="Content"/>

不幸的是,由于CheckBoxes是通过绑定创建的,所以我没有元素名。

ListBox / ListBoxItem Style的代码如下:

代码语言:javascript
复制
<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>

它的实施是:

代码语言:javascript
复制
<ListBox Grid.Row="1" Style="{StaticResource CheckBoxListStyle}" Name="lstProducts" ItemsSource="{Binding stampInfo, Mode=OneWay, Source={StaticResource vmStamp}}" 
        DisplayMemberPath="Country" >
</ListBox>

最终,我的目标是能够在文本框中显示所有选定项目的文本Contents (本例中的国家),如果每个国家用逗号分隔。我目前唯一缺少的是Country

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-14 17:10:56

当您真正想要以不同的方式显示数据项时,不要为ListBoxItem创建一个DataTemplate,而是使用DataTemplate,这正是它的目的。见数据模板概述

DisplayMemberPath中删除ListBox,因为您不能同时使用路径和自定义DataTemplate。只有在没有DataTemplate的情况下,才会设置此路径,但希望指定要显示的具体属性或属性路径。

代码语言:javascript
复制
<ListBox Grid.Row="1"
         Style="{StaticResource CheckBoxListStyle}" Name="lstProducts"
         ItemsSource="{Binding stampInfo, Mode=OneWay, Source={StaticResource vmStamp}}"/>

ControlTemplate替换为DataTemplate作为ItemTemplate。然后将ContentCommandParameter绑定到属性Country。数据上下文自动设置为绑定数据项集合中的相应项。IsChecked属性可以使用RelativeSource绑定,这是CheckBox本身。

代码语言:javascript
复制
<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中执行操作,或者在例如执行命令的按钮单击上执行操作,该命令将筛选视图模型中的绑定集合以获取选中的项。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70351671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档