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を機能させるにはどうすればよいですか?
わかりました。自分の質問に回答しました(これを行う方が良いので、お気軽に追加してください)。
<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'メソッドで使用できるようになります
これが同じ問題を抱えている人に役立つことを願っています。
両方の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>
MultiBinding
をMultiConverter
とともに使用できます
<CheckBox.IsChecked>
<MultiBinding Converter="{StaticResource YourMultiBindConverter}">
<Binding Path="IsSelected" RelativeSource={RelativeSource AncestorType=ListBoxItem}"/>
<Binding Path="Checked"/>
</MultiBinding>
</CheckBox.IsChecked>
iMultiValueConverterを実装するYourMultiBindConverterを作成します
<CheckBox Padding="10"
IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type
ListBoxItem}}, Path=IsSelected}">
<CheckBox.LayoutTransform>
<ScaleTransform ScaleX="1" ScaleY="1" />
</CheckBox.LayoutTransform>
</CheckBox>