web-dev-qa-db-ja.com

C#WPF ListBox Checkbox Binding IsChecked to a Field and IsSelected?

CheckBoxをフィールドにバインドしようとしていますが、チェックボックスのIsSelectedもトリガーしています。

データへのバインドで機能するリストボックスの設定は次のとおりです

<ListBox x:Name="lstExclude"  Grid.Column="2" SelectionMode="Single" >
  <ListBox.ItemTemplate>
    <DataTemplate>
      <CheckBox  Content="{Binding Text}" 
          IsChecked="{Binding Checked ,Mode=TwoWay}"/>
      </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

そして、これはバインディングに関連付けられたコードです

public MainWindow()
{
    InitializeComponent();

    List<CheckBoxListItem> items1 = new List<CheckBoxListItem>();
    items1.Add(new CheckBoxListItem(true, “home”));
    items1.Add(new CheckBoxListItem(false, “work”));
    items1.Add(new CheckBoxListItem(true, “cell”));
    lstExclude.ItemsSource = items1;
}

public class CheckBoxListItem
{
   public bool Checked { get; set; }
   public string Text { get; set; }

   public CheckBoxListItem(bool ch, string text)
   {
     Checked = ch;
     Text = text;
    }
}

これはチェックボックスのチェックされた値を正しくバインドしますが、チェックボックス(チェックされているかチェックされていない)をクリックすると、アイテムを選択したいので、このようにしてみました

<ListBox x:Name="lstExclude"  Grid.Column="2" SelectionMode="Single" >
  <ListBox.ItemTemplate>
    <DataTemplate>
      <CheckBox  Content="{Binding Text}" 
          IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected}"/>
      </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

これにより、チェックボックスをクリック(オンまたはオフ)した結果が得られ、アイテムが選択されます。問題は、アイテムを追加するときに[チェック済み]フィールドがバインドされていないことです。

チェックボックスをチェック済みフィールドにバインドし、それでもIsSelectedを機能させるにはどうすればよいですか?

10
user3573191

わかりました。自分の質問に回答しました(これを行う方が良いので、お気軽に追加してください)。

<ListBox x:Name="lstExclude"  Grid.Column="2" SelectionMode="Single" >
 <ListBox.ItemTemplate>
    <DataTemplate>
      <CheckBox  Content="{Binding Text}" 
          IsChecked="{Binding Checked ,Mode=TwoWay}" Click="CheckBox_Click"/>
      </DataTemplate>
 </ListBox.ItemTemplate>
</ListBox>

次に、このイベントをClickイベントに追加しました

private void CheckBox_Click(object sender, RoutedEventArgs e)
{
    var cb = sender as CheckBox;
    var item = cb.DataContext;
    lstExclude.SelectedItem = item;
}

これで、チェックボックス(オンまたはオフ)をクリックするとアイテムが選択され、アイテムは 'lstExclude.SelectedIndex'メソッドで使用できるようになります

これが同じ問題を抱えている人に役立つことを願っています。

3
user3573191

両方のUIプロパティをCheckedオブジェクトモデルプロパティにバインドすることはできますか?

<ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}">
        <Setter Property="IsSelected" Value="{Binding Checked, Mode=OneWay}"/>
    </Style>
</ListBox.ItemContainerStyle>

<ListBox.ItemTemplate>
   <DataTemplate>
      <CheckBox Content="{Binding Text}" IsChecked="{Binding Checked}"/>
   </DataTemplate>
</ListBox.ItemTemplate>
14
Rachel

MultiBindingMultiConverterとともに使用できます

<CheckBox.IsChecked>
<MultiBinding Converter="{StaticResource YourMultiBindConverter}"> 
                <Binding Path="IsSelected" RelativeSource={RelativeSource AncestorType=ListBoxItem}"/> 
                <Binding Path="Checked"/> 
 </MultiBinding> 
</CheckBox.IsChecked>

iMul​​tiValueConverterを実装するYourMultiBindConverterを作成します

2
erradi mourad
 <CheckBox Padding="10" 
           IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type  
                                                 ListBoxItem}}, Path=IsSelected}">
        <CheckBox.LayoutTransform>
                  <ScaleTransform ScaleX="1" ScaleY="1" />
        </CheckBox.LayoutTransform>
  </CheckBox>
1
Ramji