来自不同来源的WPF绑定

来自不同来源的WPF绑定,wpf,binding,tabcontrol,multibinding,Wpf,Binding,Tabcontrol,Multibinding,我正在为我的应用程序设计非常简单但有效的UI。问题是,经过一些动作,比如说重构,我开始重新规划我的设计 以前我有过observableCollection。我的选项卡控件(具有复杂的自定义样式…)绑定到该集合。但现在,我还需要像“图书馆”标签项目中有连接的USB设备。库不是一个集合,而是一个业务对象,其中包含一些重要的XML数据。我想使用我的标签控件,否则就必须发明一些切换逻辑:我不能让USB设备和库同时被选中 所以,我的问题是: 1) 也许你们中的一些人,WPF大师,知道从不同来源绑定的复杂方

我正在为我的应用程序设计非常简单但有效的UI。问题是,经过一些动作,比如说重构,我开始重新规划我的设计

以前我有过
observableCollection
。我的选项卡控件(具有复杂的自定义样式…)绑定到该集合。但现在,我还需要像“图书馆”标签项目中有连接的USB设备。库不是一个集合,而是一个业务对象,其中包含一些重要的XML数据。我想使用我的标签控件,否则就必须发明一些切换逻辑:我不能让USB设备和库同时被选中

所以,我的问题是: 1) 也许你们中的一些人,WPF大师,知道从不同来源绑定的复杂方法?最明显的决定是在其他地方做一些类似于
observeableAction
的事情,但这对我来说非常难看。
2) 或者,如果这是不可能的,也许你们中的一些人对上述问题有更简单的解决方案

如果我理解正确,您可以使用。在
选项卡控件中

<TabControl ...>
    <TabControl.ItemsSource>
        <CompositeCollection>
            <CollectionContainer Collection="{Binding UsbDevicesCollection}"/>
            <TabItem DataContext="{Binding LibraryViewModel}"/>
        </CompositeCollection>
    </TabControl.ItemsSource>
</TabControl>


当然,您必须为您的收藏和库对象设置专有名称。

如果我理解正确,您可以使用。在
选项卡控件中

<TabControl ...>
    <TabControl.ItemsSource>
        <CompositeCollection>
            <CollectionContainer Collection="{Binding UsbDevicesCollection}"/>
            <TabItem DataContext="{Binding LibraryViewModel}"/>
        </CompositeCollection>
    </TabControl.ItemsSource>
</TabControl>

当然,您必须为集合和库对象设置专有名称

  • 创建一个基类(BaseClass),您的USB设备和库或 任何未来的类/对象都应继承到

  • 您的收藏应该看起来像
    ObservableCollection

  • 最后,您需要为每个具体/派生类提供一个DataTemplate;USB设备和图书馆
  • 请注意,如果您使用的是MVVM方法,那么这将非常有效

    这将使您的设计更具可读性和可维护性

  • 创建一个基类(BaseClass),您的USB设备和库或 任何未来的类/对象都应继承到

  • 您的收藏应该看起来像
    ObservableCollection

  • 最后,您需要为每个具体/派生类提供一个DataTemplate;USB设备和图书馆
  • 请注意,如果您使用的是MVVM方法,那么这将非常有效


    这将使您的设计更具可读性和可维护性。

    尝试扩展一个通用集合,如下所示:

    public class CustomCollection<T> : List<T>
    {
    
        public object Library { get; set; }
    
        .......//properties you need
        .......//properties you need
    
        public T CurrentTab { get; set; }
    
    }
    
    公共类CustomCollection:列表
    {
    公共对象库{get;set;}
    ……你需要的财产
    ……你需要的财产
    公共T CurrentTab{get;set;}
    }
    
    在此自定义集合中,您可以保存集合,也可以保存库对象。比如:

    var UsbDevicesCollection = new CustomCollection<UsbDevice>();
    UsbDevicesCollection.Add(new UsbDevice()); // add items as usual
    UsbDevicesCollection.Library = new Object();//whatever kind of object is this
    
    var usbdevicecollection=new CustomCollection();
    usbdevicecollection.Add(新的UsbDevice());//像往常一样添加项目
    usbdevicecollection.Library=新对象()//这是什么东西
    
    当你说“我不能同时选择USB设备和库”时,你也可以在这个类中编写一些逻辑来实现这一点。 而绑定将类似于:

    <TabItem DataContext="{Binding UsbDevicesCollection.Library}"/>
    
    
    

    希望这就是您想要的。

    尝试扩展通用集合,如下所示:

    public class CustomCollection<T> : List<T>
    {
    
        public object Library { get; set; }
    
        .......//properties you need
        .......//properties you need
    
        public T CurrentTab { get; set; }
    
    }
    
    公共类CustomCollection:列表
    {
    公共对象库{get;set;}
    ……你需要的财产
    ……你需要的财产
    公共T CurrentTab{get;set;}
    }
    
    在此自定义集合中,您可以保存集合,也可以保存库对象。比如:

    var UsbDevicesCollection = new CustomCollection<UsbDevice>();
    UsbDevicesCollection.Add(new UsbDevice()); // add items as usual
    UsbDevicesCollection.Library = new Object();//whatever kind of object is this
    
    var usbdevicecollection=new CustomCollection();
    usbdevicecollection.Add(新的UsbDevice());//像往常一样添加项目
    usbdevicecollection.Library=新对象()//这是什么东西
    
    当你说“我不能同时选择USB设备和库”时,你也可以在这个类中编写一些逻辑来实现这一点。 而绑定将类似于:

    <TabItem DataContext="{Binding UsbDevicesCollection.Library}"/>
    
    
    

    希望这就是您要找的。

    很高兴我能帮忙:)很高兴我能帮忙:)