ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 绑定到公共源的多个ComboBox,强制执行不同的选择

2019-06-26 17:54:17  阅读:246  来源: 互联网

标签:c data-binding combobox filter wpf


我正在尝试将多个ComboBox绑定到一个公共源集合,并强制执行一次ComboBox选择后,所选项目将从其他ComboBox中删除.该集合是动态构建的,所以我在代码中进行.

到目前为止,我已尝试以多种方式实现这一点,而我似乎无法想出一些真正有用的东西.

我已经尝试使用默认视图的Filter谓词,但它只传递了该项,我无法知道哪个控件正在执行过滤器(并且它在概念上甚至没有意义).

我已经尝试创建新的CollectionView,但行为最终会有所不同(获取SelectionChange事件,而我之前没有使用默认视图).

几个小时以来我一直在反对这个问题,而且似乎并不想工作.我很感激有经验的WPF帮助我找到一个有效的例子.我真的希望它不会从集合中自动选择项目并开始空白(否则,每个ComboBox将有一个独特的自动选择,这太过于冒昧).

我真的很接近于允许广泛选择并在以后验证它,但这似乎是一个如此简单的概念,具有令人难以置信的难度.

谢谢

解决方法:

不错的问题,我想到了它,我可能会用MultiBinding和相应的ValueConverter接近它,即

<StackPanel>
    <StackPanel.Resources>
        <local:ComboBoxItemsSourceFilter x:Key="ComboBoxItemsSourceFilter"/>
    </StackPanel.Resources>
    <ComboBox Name="cb1">
        <ComboBox.ItemsSource>
            <MultiBinding Converter="{StaticResource ComboBoxItemsSourceFilter}">
                <Binding Path="Emps"/> <!-- Source collection binding -->
                <Binding ElementName="cb2" Path="SelectedItem"/>
                <Binding ElementName="cb3" Path="SelectedItem"/>
            </MultiBinding>
        </ComboBox.ItemsSource>
    </ComboBox>
    <ComboBox Name="cb2">
        <ComboBox.ItemsSource>
            <MultiBinding Converter="{StaticResource ComboBoxItemsSourceFilter}">
                <Binding Path="Emps"/>
                <Binding ElementName="cb1" Path="SelectedItem"/>
                <Binding ElementName="cb3" Path="SelectedItem"/>
            </MultiBinding>
        </ComboBox.ItemsSource>
    </ComboBox>
    <ComboBox Name="cb3">
        <ComboBox.ItemsSource>
            <MultiBinding Converter="{StaticResource ComboBoxItemsSourceFilter}">
                <Binding Path="Emps"/>
                <Binding ElementName="cb1" Path="SelectedItem"/>
                <Binding ElementName="cb2" Path="SelectedItem"/>
            </MultiBinding>
        </ComboBox.ItemsSource>
    </ComboBox>
</StackPanel>
public class ComboBoxItemsSourceFilter : IMultiValueConverter
{
    #region IMultiValueConverter Members

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var collection = new List<object>((object[])values[0]);
        foreach (var item in values.Skip(1))
        {
            if (item != null) collection.Remove(item);
        }
        return collection;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }

    #endregion
}

因为你在代码中执行此操作后面添加所有这些绑定应该不是什么大问题,只需将所有组合框放入一个列表中,然后就可以迭代它们.转换器可能需要一些调整,因为它假定输入集合(值[0])可以转换为对象[].

这样做的方式令人遗憾地导致许多第一次机会异常,其原因我到目前为止无法确定……

A first chance exception of type ‘System.Runtime.InteropServices.COMException’ occurred in UIAutomationProvider.dll

标签:c,data-binding,combobox,filter,wpf
来源: https://codeday.me/bug/20190626/1296363.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有