私は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"
>
それを感謝' SelectedItem.ERP'は、CLRは 'ERPPlugins'(または1のプロパティに項目に等しい検討する何かである必要があります')。これは、値型、文字列、または実際に 'ItemsSource'コレクションにある参照型、あるいは' Equals'を上書きすることができます。 'IPlugin'に値の型(' int'、 'Guid'など)または' String'の一意のIDプロパティがあれば、 'SelectedValue' /' SelectedValuePath'をそれと併用することをお勧めします。参照型のEqualsをオーバーライドすると、コード内の他の場所に噛み付く可能性があります。しかし最後の手段としてそこにあります。 –
IIRCバインディングは、実装されている場合、インスタンス間の比較を行うためにIEquatableを使用します。 – Will
@私はちょうどそれをテストしました。 IEquatable .Equals(T) 'が呼び出されていますが、' Equals(Object) 'をオーバーライドした場合にのみ選択項目が選択され、' IEquatable'は動作しません。 –