来自不同来源的 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设置正确的名字。
创建一个基础 class (BaseClass),您的 UsbDevice 和库或
任何未来 class/object 应该继承到。
您的 collection 应该看起来像 ObservableColelction<BaseClass>
。
- 最后,您的每个 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}"/>
希望这就是您要找的。
我的应用程序投影非常简单,但有效 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设置正确的名字。
创建一个基础 class (BaseClass),您的 UsbDevice 和库或 任何未来 class/object 应该继承到。
您的 collection 应该看起来像
ObservableColelction<BaseClass>
。- 最后,您的每个 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}"/>
希望这就是您要找的。