我正在为我的应用程序投影非常简单但有效的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>
当然,您必须为您的收藏和库对象设置正确的名称。
-
创建一个基类(BaseClass),您的UsbDevice和Library或任何未来的类/对象都应该继承到.
-
您的收藏应该像
ObservableColelction<BaseClass>
。 - 最后,您需要为每个具体/派生类提供一个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}"/>
希望这就是你想要的。