使用复选框状态为另一个控件

时间:2017-06-16 08:17:10

标签: c# wpf data-binding

WPF中是否有一种简单而优雅的方法可以使用另一个控件的值设置控件的数据绑定源?

例如,我有ListBox显示一组数据,当检查Checkbox时,我想使用另一组数据(例如过滤数据集)。

我可以弄清楚我可以将Checkbox绑定到bool属性,并在数据源属性的getter中工作,以便它返回一个或另一个集合,具体取决于{{1价值。但如果可能的话,我正在寻找更优雅。

4 个答案:

答案 0 :(得分:1)

如果您希望在XAML中完成此任务,您可以创建绑定到 CheckBox.IsChecked 属性的 DataTrigger 并设置 ItemsSource

-Wl,gc-sections

答案 1 :(得分:1)

您可以将ListBox.ItemsSource属性绑定到CheckBox.IsChecked属性,并使用ValueConveter检查状态并返回相应的项目。

在此示例中,我使用MultiValueConveter来允许从绑定到Window元素的模型中选择项目。

修改:包含提供ItemSource通知的示例方式。

Window.Resources声明转换器:

<Window.Resources>
    <local:IsCheckedConverter x:Key="isCheckedConverter" />
</Window.Resources>

创建XAML代码:

<CheckBox Name="CheckBox" />
<ListBox>
    <ListBox.ItemsSource>
        <MultiBinding Converter="{StaticResource isCheckedConverter}">
            <Binding ElementName="CheckBox" Path="IsChecked"/>
            <Binding Path="MyModel.MyLists" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" />
        </MultiBinding>
    </ListBox.ItemsSource>
</ListBox>

创建Window

public partial class MainWindow : Window
{
    public MyModel MyModel { get; set; }

    public MainWindow()
    {
        InitializeComponent();

        MyModel = new MyModel();
    }
}

创建召集人:

public class IsCheckedConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool isChecked = (bool)values[0];
        List<string>[] lists = (List<string>[])values[1];

        if (isChecked == true)
        {
            return lists[0];
        }
        else
        {
            return lists[1];
        }

    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }  
}

示例模型实现:

public class MyModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public List<string>[] MyLists { get; set; }

    public MyModel()
    {
        MyLists = new List<string>[2];

        MyLists[0] = new List<string>() { "abc", "def", "ghi" };
        MyLists[1] = new List<string>() { "123", "456", "789" };
    }

    public void UpdateListsExample()
    {
        MyLists[0] = new List<string>() { "abc", "def", "ghi", "jkl" };
        MyLists[1] = new List<string>() { "123", "456" };
        NotifyPropertyChanged("MyLists");
    }

    private void NotifyPropertyChanged(String propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

答案 2 :(得分:1)

  

我可以弄清楚我可以将Checkbox绑定到bool属性,并在数据源属性的getter中工作,以便它根据bool值返回一个或另一个set。但如果可能的话,我正在寻找更优雅。

嗯,在我看来,这是一个优雅的解决方案:)

@Alex Russkov的建议是个不错的选择。请注意,您需要将Tag的{​​{1}}属性绑定到ListBox的{​​{1}}属性(而不是IsChecked本身)。选中/取消选中CheckBox

时,CheckBox属性会更新
ItemsSource

答案 3 :(得分:-1)

您可以在复选框

的绑定中定义属性
<CheckBox Name="myCheckBox" IsChecked="{Binding Path=Change}" />

然后在viewmodel中处理复选框的真/假条件

private bool isCheckedChange = false;

public bool Change {
   get { return isCheckedChange; }
   set {
       if (isCheckedChange)
       {
           MyListBocValue = new List<string> { "String1", "String2" };
       }else{
           MyListBocValue = new List<string> { "String3", "String4" };
       }
    }
 }

public List<String> MyListBocValue { get; set; }