wpf列表框复选框组合,真的卡住了

时间:2011-02-09 03:11:49

标签: wpf combobox listbox binding

我试图将checkbox和listview链接在一起,然后使用绑定方法设置对象的路径,以便在列表框中设置复选框IsChecked状态。

List<Test1> datas = new List<Test1>();

var data = new Test1 {Key = 1, Value = "Hello", IsSelected= true};
    datas.Add(data);
    data = new Test1 {Key = 2, Value = "Hello2", IsSelected= false};
    datas.Add(data);

我需要发生的是,如果选中复选框(IsSelected为true),那么我需要填充这些值,然后当我单击并取消选中GUI中的复选框时,我需要它也选择正确的监听项目所以我可以到达标签属性。

以下代码未设置复选框IsChecked。

<ListBox ItemsSource="{Binding}" Name="lstSwimLane" Width="225" Height="125" SelectionChanged="lstSwimLane_SelectionChanged">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected, Mode=TwoWay}" 
                                          Checked="CheckBox_Checked" 
                                          Unchecked="CheckBox_Unchecked" />
                <TextBlock Text="{Binding Path=Value}"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

为了将复选框设置为对象中的值,我需要更改什么?我甚至尝试过INotifyChange等......

这也是对象。

public class Test1 : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private bool _isChecked;

    public int Key { get; set; }
    public string Value { get; set; }

    public bool IsSelected
    {
        get { return _isChecked; } 
        set
        {
            if(_isChecked != value)
            {
                _isChecked = value;
                OnPropertyChanged("IsSelected");
            }
        }
    }

    protected void OnPropertyChanged(string name)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}

我是所有这些wpf的新手,我很难过。

感谢。

2 个答案:

答案 0 :(得分:6)

你需要这个“三通”工作吗?所以设置三个属性中的任何一个

  • ListBoxItem.IsSelected
  • CheckBox.IsChecked
  • Item1.IsSelected

会影响其他两个属性吗?不幸的是,在WPF中没有这样的绑定,所以你将不得不做一些额外的工作。

<强>更新
正如Robert Rossney所指出的,更好的解决办法就是绑定

  • ListBoxItem.IsSelectedItem1.IsSelected
  • CheckBox.IsCheckedListBoxItem.IsSelected

更新了Xaml

<ListBox ItemsSource="{Binding}"
         Name="lstSwimLane"
         SelectionMode="Multiple"
         Width="225" Height="125" SelectionChanged="lstSwimLane_SelectionChanged">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsSelected"
                Value="{Binding Path=IsSelected,
                                Mode=TwoWay}"/>
        </Style>
    </ListBox.ItemContainerStyle>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox Checked="CheckBox_Checked"
                          Unchecked="CheckBox_Unchecked"
                          IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}},
                                              Path=IsSelected}">
                </CheckBox>
                <TextBlock Text="{Binding Path=Value}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

答案 1 :(得分:0)

如果有人感兴趣,这里是listbox / combox的标记。它将显示水平。

再次感谢大家的帮助,我非常感谢。

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
         ItemsSource="{Binding}" 
         Name="lstSwimLane" 
         SelectionMode="Multiple"
         Width="auto" 
         Height="auto"
         Background="Transparent"
         BorderThickness="0" 
         SelectionChanged="lstSwimLane_SelectionChanged" >
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel IsItemsHost="True" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>

    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsSelected" Value="{Binding Path=IsChecked, Mode=TwoWay}"/>
        </Style>
    </ListBox.ItemContainerStyle>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Margin="3,3,3,3">
                <CheckBox IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=IsSelected}"
                          Checked="CheckBox_Checked" 
                          Unchecked="CheckBox_Unchecked" 
                          VerticalAlignment="Center" 
                          Margin="0,0,4,0" />
                <TextBlock Text="{Binding Value}" VerticalAlignment="Center"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>