2017-06-01 12 views
0

私はBindingsを使ってカスタムタイプのObservableCollectionからアイテムを描画するコンボボックスを持っています。 DisplayMemberPathを設定して、正しい文字列とものを表示するようにしました。今、私はSelectedItem/SelectedValueを操作しています。別のカスタムタイプの異なるObservableCollectionにバインドされているが、同じタイプのComboBoxリストのプロパティを持つListBoxの選択項目に依存する必要があります。ListBoxに依存するSelectedItemを使用して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 
     }; 
    } 

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

そして、私のComboBoxの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'(または1のプロパティに項目に等しい検討する何かである必要があります')。これは、値型、文字列、または実際に 'ItemsSource'コレクションにある参照型、あるいは' Equals'を上書きすることができます。 'IPlugin'に値の型(' int'、 'Guid'など)または' String'の一意のIDプロパティがあれば、 'SelectedValue' /' SelectedValuePath'をそれと併用することをお勧めします。参照型のEqualsをオーバーライドすると、コード内の他の場所に噛み付く可能性があります。しかし最後の手段としてそこにあります。 –

+0

IIRCバインディングは、実装されている場合、インスタンス間の比較を行うためにIEquatableを使用します。 – Will

+1

@私はちょうどそれをテストしました。 IEquatable .Equals(T) 'が呼び出されていますが、' Equals(Object) 'をオーバーライドした場合にのみ選択項目が選択され、' IEquatable'は動作しません。 –

答えて

0
私はここにコードを持っている

申し分なく、私はゾルそのプラグインへの接続でIPluginタイプを変更することでそれを見てください。私が最初にIPluginを使ったのは、私の知る限りではありません。しかし、このように、私はどこでも同じタイプのプラグインを持っています。あなたはSelectedValueの `で行けばあなたの助けのための

おかげで、

関連する問題