2017-06-01 1 views
0

Ich habe eine Combobox, die ihre Objekte aus einer ObservableCollection eines benutzerdefinierten Typs mit Bindings zeichnet. Ich habe den DisplayMemberPath so eingestellt, dass er die richtige Zeichenkette und die entsprechenden Daten anzeigt. Jetzt fummle ich mit SelectedItem/SelectedValue. Es muss vom ausgewählten Element einer ListBox abhängig sein, die an eine andere ObservableCollection eines anderen benutzerdefinierten Typs gebunden ist, die jedoch eine Eigenschaft des gleichen Typs der ComboBox-Liste aufweist.Wie binden Sie eine Combobox an eine ObservableCollection mit SelectedItem abhängig von ListBox?

Wie kann ich dies mit MVVM binden? Ist es überhaupt möglich?

ich meinen Code hier haben:

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

Und das XAML-Schnipsel meines ComboBox:

<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' etwas sein muss, dass die CLR wird zu einem Element in' ERPPlugins' (oder auf eine Eigenschaft eines gleich betrachten, wenn du mit 'SelectedValue gehen '). Es kann ein Werttyp oder ein String oder ein Referenztyp sein, der sich tatsächlich in der ItemsSource-Sammlung befindet, oder Sie können Equals überschreiben. Wenn 'IPlugin' irgendeine eindeutige ID-Eigenschaft hat, die ein Werttyp (' int', 'Guid', etc.) oder' String' ist, würde ich 'SelectedValue' /' SelectedValuePath' lieber mit diesem verwenden. Überschreiben Gleichheit bei einem Referenztyp kann Sie an anderer Stelle in Ihrem Code verletzen. Aber es ist da als letzter Ausweg. –

+0

IIRC-Bindungen verwenden IEquatable, falls implementiert, um den Vergleich zwischen Instanzen durchzuführen. – Will

+1

@Will ich habe das gerade getestet. Etwas ruft 'IEquatable .Equals (T)', aber das ausgewählte Element wird nur ausgewählt, wenn ich 'Equals (Object)' überschreibe, und ich brauche 'IEquatable' nicht, damit das funktioniert. –

Antwort

0

Okay, ich sol Ändern Sie den IPlugin-Typ in der Connection to Plugin. Warum ich IPlugin dort überhaupt verwendet habe, ist meines Wissens nicht bekannt. Aber so habe ich überall die gleiche Art von Plugin.

Danke für Ihre Hilfe, schätzen es

Verwandte Themen