使项目选择ToggleButtons的ListView

时间:2015-11-02 19:17:29

标签: c# .net wpf xaml listview

我有一个ListView,每个项目都有一个切换按钮。我希望能够在从列表中选择项目时切换按钮,并在取消选择项目时解开。它必须遵循mvvm,所以没有代码。

这是我的设置:

            <ListView x:Name="stampList"
                    ItemsSource="{Binding AllStampImages}">

                <ListView.ItemTemplate>              
                    <DataTemplate>

                        <StackPanel Orientation="Vertical" Margin="0,2,0,0">
                            <ToggleButton Width="72" 
                                        Height="72"
                                        Command="{Binding StampSelectedCommand}"/>
                        </StackPanel>

                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

我的问题是,当我点击切换按钮时,未选择该项目。同样,当我点击切换按钮外部(仍在listView项目的边界内)时,该项目被选中但按钮未切换。

如何将两者捆绑在一起?

enter image description here

2 个答案:

答案 0 :(得分:2)

您可能必须将Selector.IsSelected属性绑定到您的custome属性。在这种情况下,你切换按钮的属性。

尝试类似:

        <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="Selector.IsSelected" Value="{Binding [Value of your toggle button], Mode=TwoWay}" />
            </Style>
        </ListView.ItemContainerStyle>

答案 1 :(得分:1)

最简洁的方法是使用ViewModel或Model层提供的项目集合。

  1. 每个项目都应该有一个 IsSelected 布尔属性:
  2. class LineItem
    {
        private bool isSelected;
        public bool IsSelected
        {
            get { return isSelected; }
            set { isSelected = value; }
        }
        private String label;
        public String Label
        {
            get { return label; }
            set { label = value; }
        }
    }
    
    1. 应该对模型 IsSelected 属性:
    2. 进行一些绑定

      2.1在ListView.ItemTemplate

      <ListView x:Name="list1" SelectionMode="Multiple" ItemContainerStyle="{DynamicResource ListViewItemStyle1}" Margin="0,0,334,0">
          <ListView.ItemTemplate>
              <DataTemplate>
                  <ToggleButton Margin="5" Content="{Binding Label}" IsChecked="{Binding IsSelected}"/>
              </DataTemplate>
          </ListView.ItemTemplate>
      

      2.2在ListViewItem模板

      右键单击列表视图

      创建模板

      在菜单中:“编辑其他模板/编辑生成的项目容器(空)。

      填写以下代码:“

      <Style x:Key="ListViewItemStyle1" TargetType="{x:Type ListViewItem}">
              <Setter Property="IsSelected" Value="{Binding IsSelected}"/>
              <Setter Property="Template">
                  <Setter.Value>
                      <ControlTemplate TargetType="{x:Type ListViewItem}">
                          <Grid x:Name="Bd">
                              <ContentPresenter  />
                          </Grid>
                          <ControlTemplate.Triggers>
                              <MultiTrigger>
                                  <MultiTrigger.Conditions>
                                      <Condition Property="IsSelected" Value="True"/>
                                  </MultiTrigger.Conditions>
                                  <Setter Property="Background" TargetName="Bd" Value="#FF204080"/>
                              </MultiTrigger>
                          </ControlTemplate.Triggers>
                      </ControlTemplate>
                  </Setter.Value>
              </Setter>
          </Style>
      

      触发器基于Model IsSelected属性 网格名为Bd,以便在触发器中更改其背景。

      链接到完整的工作演示:http://1drv.ms/1iyvPgt

      注意

      我试图回答这个问题。 但在我的拙见中,我不会使用ListView可能是你有充分的理由我知道。

      我更喜欢使用ItemsControl,它是一个不允许进行选择的列表框。

      如果需要的话,我会使用Toggle按钮和自定义模板放置蓝色背景 它将删除所有触发器的东西 ,...

      最佳编码