2016-01-12 2 views
0

Я проектирую довольно простой, но эффективный интерфейс для моего приложения. Проблема в том, что после некоторых действий, скажем, рефакторинга, я пришел, чтобы перепроектировать мой проект.WPF привязка из разных источников

Раньше у меня было ObsrvableCollection<UsbDevice>. И мой контроль табуляции (со сложным пользовательским стилем ..) был привязан к этой коллекции. Но теперь мне нужно также что-то вроде элемента «Библиотека», чтобы быть рядом с подключенными USB-устройствами. Библиотека - это не коллекция, а просто бизнес-объект, содержащий внутри себя некоторые важные XML-данные. Id нравится использовать элемент управления вкладками, потому что в противном случае будет необходимо изобрести какую-то логику переключения: я не могу одновременно выбирать одновременно 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

Try расширяя общую коллекцию, как показано ниже:

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

надеюсь, что это то, что вы ищете.

Смежные вопросы