2016-01-12 124 views
0

我正在为我的应用程序投影非常简单但有效的用户界面。问题是,在一些行动后,让我们说,重构,我来重新计划我的设计。来自不同来源的WPF绑定

以前我有过ObsrvableCollection<UsbDevice>。而我的选项卡控制(具有复杂的自定义风格..)被绑定到该集合。但是现在我需要像“图书馆”标签项目那样连接USB设备。库不是一个集合,而只是一个业务对象,其中包含一些重要的XML数据。我喜欢使用我的选项卡控件,否则有必要发明一些开关逻辑:我不能让USB设备和库同时被选中。

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

回答

2

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

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

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

+0

thx很多,这是决定! – 52hertz

+0

很高兴我可以帮助:) –

0
  1. 创建一个基类(BaseClass的),你的UsbDevice和图书馆或 任何未来的类/对象应继承来。

  2. 你的收集应该像ObservableColelction<BaseClass>

  3. 最后,您需要为每个具体/派生类使用DataTemplate; UsbDevice和库。

请注意,如果您使用的是MVVM方法,这将非常有效。

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

0

尝试延伸的泛型集合象下面这样:

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}"/> 

希望这是你在找什么。