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"
>
'SelectedItem.ERP'必须的东西,CLR将考虑等于'ERPPlugins'的项目(或一个的属性,如果你用'去的SelectedValue ')。它可以是一个值类型或字符串,或者是一个实际在'ItemsSource'集合中的引用类型,或者你可以覆盖'Equals'。如果'IPlugin'具有任何类型的值类型('int','Guid'等等)或'String'的唯一ID属性,我宁愿使用'SelectedValue' /'SelectedValuePath'。在参考类型上重写Equals可以在代码中的其他地方咬你。但它是作为最后的手段。 –
IIRC绑定将使用IEquatable(如果已实施)在实例之间进行比较。 – Will
@我刚刚测试过。有些东西叫'IEquatable .Equals(T)',但只有当我重写'Equals(Object)'时才会选择所选项目,并且我不需要'IEquatable'来工作。 –