带复选框的列表框+未在空白区域中触发的命令绑定单击

时间:2015-12-01 05:28:20

标签: c# wpf listbox

我确信我在这里缺少一些小东西,但不知何故无法弄明白。我有一个列表框绑定到我的视图模型中的集合。在我的数据模板列表框项目中,我有一个复选框。该复选框具有绑定到视图模型中的ICommand的命令。当显示一些复选框时,文本足以完全覆盖列表框项目的宽度,其他则不会留下末尾的空白区域。  我想要的行为是,当用户单击列表框项目中的任何位置时(即使在最后一个空白空间中),应该调用该命令。问题是目前我只能在视图模型中调用Command,如果用户仅在复选框所在的区域中单击(如果用户单击左侧空白区域,则不调用该命令)

我尝试过使用带控件模板的切换按钮作为复选框的各种选项。切换按钮覆盖整个项目空间并根据需要绑定到命令,但是当我在切换按钮的控件模板中使用复选框时,Command绑定将停止工作。

以下是我的XAML。任何建议/指针都应该有所帮助。

<ListBox ItemsSource="{Binding Values}" SelectionMode="Multiple" ScrollViewer.VerticalScrollBarVisibility="Visible">
  <ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource MetroListBoxItem}">
      <Setter Property="IsSelected" Value="{Binding Selected}"/>
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
      <Setter Property="HorizontalAlignment" Value="Stretch"/>
  </Style>
  </ListBox.ItemContainerStyle>
  <ListBox.ItemTemplate>
    <DataTemplate>
      <Grid>
        <CheckBox Grid.Column="0" IsChecked="{Binding Selected,Mode=OneWay}" Content="{Binding Caption}" Command="{Binding DataContext.ItemSelection, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}" >
          <CheckBox.CommandParameter>
            <MultiBinding Converter="{StaticResource IListDataConverter}">
              <Binding Path="."/>
              <Binding RelativeSource="{RelativeSource Self}" Path="IsChecked"/>
            </MultiBinding>
          </CheckBox.CommandParameter>
        </CheckBox>
      </Grid>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>
  • 吉里贾

1 个答案:

答案 0 :(得分:0)

嗯,简单示例没有在ListBox上使用IsSelected的双/三逻辑,并将其绑定到CheckBox和ViewModel。

在XAML中,我创建了ScrollViewer,ItemsControl。

<ScrollViewer Width="200">
    <ItemsControl ItemsSource="{Binding Items}">
        <ItemsControl.ItemTemplate>
            <DataTemplate DataType="local:SelectableObject">
                <CheckBox IsChecked="{Binding IsSelected}"
                            Command="{Binding DataContext.ItemSelection, RelativeSource={RelativeSource FindAncestor, AncestorType=ItemsControl}}">
                    <CheckBox.Content>
                        <TextBlock Background="Blue" Text="{Binding Name}"/>
                    </CheckBox.Content>
                </CheckBox>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</ScrollViewer>

在codebehind中:

private ICommand _itemSelection;
public ICommand ItemSelection => _itemSelection ?? (_itemSelection = new DelegateCommand(_ => MessageBox.Show("Click")));

public MainWindow()
{
    Items.Add(new SelectableObject("Item 1"));
    Items.Add(new SelectableObject("Item 2"));
    Items.Add(new SelectableObject("Item 3"));
    InitializeComponent();
    DataContext = this;
}

public ObservableCollection<SelectableObject> Items { get; } = new ObservableCollection<SelectableObject>(); 

简单的课程

public class SelectableObject : DependencyObject
{
    public SelectableObject(string name)
    {
        Name = name;
    }

    public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register("IsSelected",
        typeof (bool), typeof (SelectableObject), new FrameworkPropertyMetadata());

    public bool IsSelected
    {
        get { return (bool) GetValue(IsSelectedProperty); }
        set { SetValue(IsSelectedProperty, value); }
    }

    public string Name { get; set; }
}