Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CheckComboBox集合属性不起作用_C#_Wpf_Xaml_Combobox_Xceed - Fatal编程技术网

C# CheckComboBox集合属性不起作用

C# CheckComboBox集合属性不起作用,c#,wpf,xaml,combobox,xceed,C#,Wpf,Xaml,Combobox,Xceed,我正在使用XCeed复选框: 在我的组合框中有一些类型。组合框中正确列出了所有类型。我的问题是,如果取消选中某个项,则不会调用IsFiltered的set属性:大多数以MemberPath结尾的字段都在查找包含属性名称的字符串 在你的情况下,你需要 ValueMemberPath="IsFiltered" 而不是 ValueMemberPath="{Binding IsFiltered, Mode=TwoWay} 现在,它在数据对象上查找一个名为IsFiltered的字符串属性,该属性将告诉

我正在使用XCeed复选框:

在我的组合框中有一些类型。组合框中正确列出了所有类型。我的问题是,如果取消选中某个项,则不会调用IsFiltered的set属性:

大多数以MemberPath结尾的字段都在查找包含属性名称的字符串

在你的情况下,你需要

ValueMemberPath="IsFiltered"
而不是

ValueMemberPath="{Binding IsFiltered, Mode=TwoWay}

现在,它在数据对象上查找一个名为IsFiltered的字符串属性,该属性将告诉它要为值使用什么属性名,并且由于IsFiltered是bool,因此不起作用。

从文档中看,似乎没有办法使组合框将复选框状态绑定到项属性。而是通过SelectedItems属性公开所选项目。您可以使用SelectedItemsOverride指定自己的集合来保存所选项目,因此将其绑定到IsFiltered没有意义。您可能需要做的是将SelectedItemsOverride绑定到ObservableCollection,手动观察对集合的更改,并在选择更改时更新items的IsFiltered属性。

来自文档:

您需要一个ObservableCollection和一个类,其中包含触发notifychanged事件的IsChecked和Item属性

下面的工作示例:当您单击设置A和C按钮时,项目A和C将按预期进行检查

MainWindow.xaml.cs

MainWindow.xaml


我认为此控件上的ValueMemberPath用于指定要包含在SelectedValue中的每个选定项的子属性。我不认为它反映了选择状态,即项目是否被选中。@MikeStrobel啊,你可能是对的。我立即被ValueMeMeBurPoT错误用法捕获,并且没有考虑到与CykDeCo框的设计和使用有关的其他问题。我以前没有使用过XCeed的控件,所以不知道它们是如何工作的。
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Windows;

namespace WpfApp6
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private ViewModel viewModel;

        public MainWindow()
        {
            InitializeComponent();

            viewModel = new ViewModel();

            foreach (var item in new string[] { "A", "B", "C", "D"})
            {
                viewModel.CheckComboBoxItems.Add(new CheckComboBoxItems { IsChecked = false, Item = item}); 
            }

            DataContext = viewModel;

        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {   
            foreach (var checkBoxToSet in viewModel.CheckComboBoxItems)
            {
                if (checkBoxToSet.Item.Equals("A") || checkBoxToSet.Item.Equals("C"))
                {
                    checkBoxToSet.IsChecked = true;
                }
            }
        }
    }

    public class ViewModel
    {
        public ObservableCollection<CheckComboBoxItems> CheckComboBoxItems { get; set; } = new ObservableCollection<CheckComboBoxItems>();
    }

    public class CheckComboBoxItems : INotifyPropertyChanged
    {
        private bool _isChecked;
        private string _item;

        public bool IsChecked
        {
            get
            {
                return _isChecked;
            }
            set
            {
                _isChecked = value;
                NotifyPropertyChanged("IsChecked");
            }
        }


        public string Item
        {
            get
            {
                return _item;
            }
            set
            {
                _item = value;
                NotifyPropertyChanged("Item");
            }
        }

        private void NotifyPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}
<Window x:Class="WpfApp6.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp6"
         xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <xctk:CheckComboBox ItemsSource="{Binding CheckComboBoxItems}" DisplayMemberPath="Item" SelectedMemberPath="IsChecked" Height="50" Width="150"/>
        <Button Content="Set A und C" Width="150" Height="50" Margin="20" Click="Button_Click"/>
    </StackPanel>
</Window>