WPF中是否有一种简单而优雅的方法可以使用另一个控件的值设置控件的数据绑定源?
例如,我有ListBox
显示一组数据,当检查Checkbox
时,我想使用另一组数据(例如过滤数据集)。
我可以弄清楚我可以将Checkbox
绑定到bool
属性,并在数据源属性的getter中工作,以便它返回一个或另一个集合,具体取决于{{1价值。但如果可能的话,我正在寻找更优雅。
答案 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; }