2017-06-01 141 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超出了我的理解。但是就像這樣,我到處都有相同類型的插件。

感謝您的幫助,感激不盡

相關問題