来自不同来源的 WPF 绑定

WPF binding from different sources

我的应用程序投影非常简单,但有效 UI。问题是在采取一些行动之后,比方说重构,我开始重新设计我的设计。

之前我有过ObsrvableCollection<UsbDevice>。我的选项卡控件(具有复杂的自定义样式..)绑定到该集合。但现在我还需要像 'Library' 选项卡项一样与连接的 USB 设备一起出现。库不是一个集合,而只是一个业务对象,其中包含一些重要的 XML 数据。我喜欢使用我的选项卡控件,否则将需要发明一些切换逻辑:我不能同时选择 USB 设备和库。

所以,我的问题是: 1)也许你们中的一些人,WPF GURUS,知道从不同来源绑定的棘手方法?最明显的决定是在其他地方制作类似 ObservableColelction<object> 的东西,但这对我来说非常难看。 2)或者,如果那是不可能的,也许你们中的一些人对上述问题有更简单的解决方案?

如果我理解正确,你可以使用 CompositeCollection。在你的 TabControl:

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

当然你必须为你的collection和图书馆object设置正确的名字。

  1. 创建一个基础 class (BaseClass),您的 UsbDevice 和库或 任何未来 class/object 应该继承到。

  2. 您的 collection 应该看起来像 ObservableColelction<BaseClass>

  3. 最后,您的每个 concrete/derived classes 都需要一个 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; }

}

在此自定义集合中,您可以保存您的集合,也可以拥有您的图书馆对象。喜欢:

var UsbDevicesCollection = new CustomCollection<UsbDevice>();
UsbDevicesCollection.Add(new UsbDevice()); // add items as usual
UsbDevicesCollection.Library = new Object();//whatever kind of object is this

当您说 "I can not let both USB device and Library to be selected at the same time." 时,您也可以在此 class 中编写某种逻辑来做到这一点。 绑定就像:

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

希望这就是您要找的。