2017-06-01 138 views
0

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

我该如何使用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 
     }; 
    } 

Connection.cs

public class Connection 
{ 
    public string ConnectionName { get; set; } 
    public IPlugin ERP { get; set; } 
    public IPlugin Shop { get; set; } 

    public Connection(string connName) 
    { 
     ConnectionName = connName; 
    } 
} 

我的组合框的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" 
    > 
+0

'SelectedItem.ERP'必须的东西,CLR将考虑等于'ERPPlugins'的项目(或一个的属性,如果你用'去的SelectedValue ')。它可以是一个值类型或字符串,或者是一个实际在'ItemsSource'集合中的引用类型,或者你可以覆盖'Equals'。如果'IPlugin'具有任何类型的值类型('int','Guid'等等)或'String'的唯一ID属性,我宁愿使用'SelectedValue' /'SelectedValuePath'。在参考类型上重写Equals可以在代码中的其他地方咬你。但它是作为最后的手段。 –

+0

IIRC绑定将使用IEquatable(如果已实施)在实例之间进行比较。 – Will

+1

@我刚刚测试过。有些东西叫'IEquatable .Equals(T)',但只有当我重写'Equals(Object)'时才会选择所选项目,并且我不需要'IEquatable'来工作。 –

回答

0

好的,我sol通过改变Connection to Plugin中的IPlugin类型来实现它。为什么我首先在​​那里使用IPlugin超出了我的理解。但是就像这样,我到处都有相同类型的插件。

感谢您的帮助,感激不尽

相关问题