C# 如何将组合框绑定到SelectedItem依赖于ListBox的ObservableCollection?

C# 如何将组合框绑定到SelectedItem依赖于ListBox的ObservableCollection?,c#,wpf,mvvm,combobox,listbox,C#,Wpf,Mvvm,Combobox,Listbox,我有一个combobox,它使用绑定从自定义类型的ObservableCollection中提取它的项。我已经设置了DisplayMemberPath,以便它显示正确的字符串和内容。现在我正在摆弄SelectedItem/SelectedValue。它需要依赖于列表框的选定项,该列表框绑定到另一个自定义类型的不同ObservableCollection,但具有与ComboBox列表相同类型的属性 如何使用MVVM绑定此文件?有可能吗 我这里有我的代码: MainWindowViewModel.c

我有一个combobox,它使用绑定从自定义类型的ObservableCollection中提取它的项。我已经设置了DisplayMemberPath,以便它显示正确的字符串和内容。现在我正在摆弄SelectedItem/SelectedValue。它需要依赖于列表框的选定项,该列表框绑定到另一个自定义类型的不同ObservableCollection,但具有与ComboBox列表相同类型的属性

如何使用MVVM绑定此文件?有可能吗

我这里有我的代码:

MainWindowViewModel.cs

private ObservableCollection<Plugin<IPlugin>> erpPlugins;
    public ObservableCollection<Plugin<IPlugin>> ERPPlugins
    {
        get
        {
            return erpPlugins;
        }
        set
        {
            erpPlugins = value;
            OnProprtyChanged();
        }
    }

    private ObservableCollection<Plugin<IPlugin>> shopPlugins;
    public ObservableCollection<Plugin<IPlugin>> ShopPlugins
    {
        get
        {
            return shopPlugins;
        }
        set
        {
            shopPlugins = value;
            OnProprtyChanged();
        }
    }

    private ObservableCollection<Connection> connections;
    public ObservableCollection<Connection> Connections
    {
        get {
            return connections;
        }
        set
        {
            connections = value;
        }
    }

    public MainWindowViewModel()
    {
        instance = this;

        ERPPlugins = new ObservableCollection<Plugin<IPlugin>>(GenericPluginLoader<IPlugin>.LoadPlugins("plugins").Where(x => x.PluginInstance.Info.Type == PluginType.ERP));
        ShopPlugins = new ObservableCollection<Plugin<IPlugin>>(GenericPluginLoader<IPlugin>.LoadPlugins("plugins").Where(x => x.PluginInstance.Info.Type == PluginType.SHOP));
        Connections = new ObservableCollection<Connection>
        {
            new Connection("test") { ERP = ERPPlugins[0].PluginInstance, Shop = ShopPlugins[0].PluginInstance } // Debug
        };
    }
以及我的组合框的XAML片段:

<ComboBox 
    Margin="10,77,232,0" 
    VerticalAlignment="Top" 
    x:Name="cmbERP" 
    ItemsSource="{Binding ERPPlugins}" 
    SelectedItem="{Binding ElementName=lbVerbindungen, Path=SelectedItem.ERP}" 
    DisplayMemberPath="PluginInstance.Info.Name"
    >

好的,我通过将连接中的IPlugin类型更改为Plugin解决了这个问题。我当初为什么在那里使用伊普卢金是我所不知道的。但是像这样,我到处都有相同类型的插件


谢谢你的帮助,欣赏它

<代码> SelectedItem。ERP 是CLR将考虑的东西,与<代码> ErpPultIsIs/COD>中的一个项目(或一个属性,如果你使用<代码> SelectedValue < /C> >)。它可以是值类型或字符串,也可以是实际位于
ItemsSource
集合中的引用类型,或者您可以覆盖
Equals
。如果
IPlugin
具有任何类型的唯一ID属性,该属性是值类型(
int
Guid
,等等)或
String
,我更愿意使用
SelectedValue
/
SelectedValuePath
)。在引用类型上重写Equals可能会影响代码中的其他地方。但这是最后的手段。IIRC绑定将使用IEquatable(如果实现的话)在实例之间进行比较。@我将对此进行测试。有东西在调用
IEquatable.Equals(T)
,但只有当我重写
Equals(Object)
时,所选项目才会被选中,我不需要
IEquatable
来实现它。@EdPlunkett这太可惜了。WPF通常在这方面做得很好(例如,当属性正确时,使用TypeDescriptor访问属性值)。@EdPlunkett Aight,因此我只需在加载插件时设置Id字段
<ComboBox 
    Margin="10,77,232,0" 
    VerticalAlignment="Top" 
    x:Name="cmbERP" 
    ItemsSource="{Binding ERPPlugins}" 
    SelectedItem="{Binding ElementName=lbVerbindungen, Path=SelectedItem.ERP}" 
    DisplayMemberPath="PluginInstance.Info.Name"
    >