我试图将CheckBox绑定到字段,但也会触发复选框的IsSelected。
以下是使用Binding to data
的ListBox设置<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>
因此,这给了我单击复选框(选中或取消选中)的结果,它将选择该项目。现在的问题是,当我添加项目时,Checked字段没有绑定。
如何让复选框同时绑定到Checked字段并且仍然有IsSelected工作?
答案 0 :(得分:14)
是否可以将两个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>
答案 1 :(得分:3)
好的,我回答了我自己的问题(最好这样做,所以随意添加)我在复选框中添加了一个Click事件
<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;
}
现在,当您单击复选框(选中或取消选中)时,该项目会被选中,并且该项目可用于&lt; lstExclude.SelectedIndex&#39;方法
我希望这有助于任何人遇到同样的问题。
答案 2 :(得分:2)
您可以MultiBinding
使用MultiConverter
<CheckBox.IsChecked>
<MultiBinding Converter="{StaticResource YourMultiBindConverter}">
<Binding Path="IsSelected" RelativeSource={RelativeSource AncestorType=ListBoxItem}"/>
<Binding Path="Checked"/>
</MultiBinding>
</CheckBox.IsChecked>
创建一个实现IMultiValueConverter的 YourMultiBindConverter
答案 3 :(得分:1)
<CheckBox Padding="10"
IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type
ListBoxItem}}, Path=IsSelected}">
<CheckBox.LayoutTransform>
<ScaleTransform ScaleX="1" ScaleY="1" />
</CheckBox.LayoutTransform>
</CheckBox>