【问题标题】:CheckComboBox set property doesn't workCheckComboBox 设置属性不起作用
【发布时间】:2014-10-28 13:19:27
【问题描述】:

我正在使用 XCeed CheckComboBox:https://wpftoolkit.codeplex.com/wikipage?title=CheckComboBox&referringTitle=Home

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

【问题讨论】:

    标签: c# wpf xaml combobox xceed


    【解决方案1】:

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

    在你的情况下,你需要

    ValueMemberPath="IsFiltered"
    

    而不是

    ValueMemberPath="{Binding IsFiltered, Mode=TwoWay}
    

    现在它在您的数据对象中查找名为IsFiltered 的字符串属性,该属性将告诉它为Value 使用什么属性名称,并且由于您的IsFiltered 是一个布尔值,所以这不起作用。

    【讨论】:

    • 我认为此控件上的ValueMemberPath 用于指定要包含在SelectedValue 中的每个选定项的子属性。我不认为它反映了选择状态,即该项目是否被选中。
    • @MikeStrobel 啊,你可能是对的。我立即被ValueMemberPath的错误使用抓住了,没有考虑到CheckedComboBox的设计和使用可能还有其他问题。我以前没有使用过 XCeed 的控件,所以不确定它们是如何工作的。
    【解决方案2】:

    来自文档:

    https://xceed.com/wp-content/documentation/xceed-toolkit-plus-for-wpf/Xceed.Wpf.Toolkit~Xceed.Wpf.Toolkit.CheckComboBox.html

    还有

    https://xceed.com/wp-content/documentation/xceed-toolkit-plus-for-wpf/Xceed.Wpf.Toolkit~Xceed.Wpf.Toolkit.Primitives.Selector~SelectedMemberPath.html

    您需要一个 ObservableCollection 和一个持有 IsChecked 和 Item 属性的类来触发 notifychanged 事件。

    在工作示例下方:当您单击Set A and C 按钮时,将按预期检查项目AC

    MainWindow.xaml.cs

    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;
        }
    }
    

    MainWindow.xaml

    <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>
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-04-07
        • 1970-01-01
        • 2012-10-16
        • 1970-01-01
        • 2021-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-06
        相关资源
        最近更新 更多