来自不同来源的WPF绑定



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

以前我有ObsrvableCollection<UsbDevice>。我的选项卡控件(具有复杂的自定义样式..)绑定到该集合。但现在我还需要一些类似"图书馆"选项卡项目的东西,以便在连接的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>

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

  1. 创建一个基类(BaseClass),您的UsbDevice和Library或任何未来的类/对象都应该继承到.

  2. 您的收藏应该像ObservableColelction<BaseClass>

  3. 最后,您需要为每个具体/派生类提供一个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

当你说"我不能同时选择USB设备和库"时,你也可以在这个类中编写一些逻辑来做到这一点。和绑定类似:

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

希望这就是你想要的。

相关内容

  • 没有找到相关文章

最新更新