2016-02-05 6 views
0

Я создал очень простой пользовательский элемент управления на основе списка с двумя свойствами зависимостей. Эти свойства зависимостей называются SourceA и SourceB. Эти два свойства зависимостей отображаются для пользователя, которым он привязан. Целью было иметь несколько слотов связывания для коллекций. Что до сих пор замечательно.Пользовательский контроль wpf на основе списка

В моем пользовательском элементе управления я объединяю эти два списка в один, который затем отображается в списке, как показано на изображении ниже.

Мой вопрос?

Мне нужен способ отличить предметы друг от друга после их объединения. Поэтому, когда я расширяю пользовательский элемент управления, я все еще знаю на бэкэнд, что элементы в списке поступают из SourceA или SourceB. Причина в том, что я могу добавить определенную функциональность в элементы SourceA vs SourceB.

Есть ли способ, по которому я могу пометить два входящих элемента списка, в рамках настраиваемого элемента управления? Будет ли enum, interface или wrapper решением?

DropBox Решение: https://www.dropbox.com/s/74su534n1szk91b/NexusEditor_03.zip?dl=0

<Grid> 
    <nexus:NexusEditor 
     SourceB="{Binding ItemList}" 
     SourceA="{Binding GroupList}"/> 
</Grid> 

Thanks

+0

Трудно предположить много вещей, я предлагаю опубликовать некоторый код и задать конкретный вопрос. –

+0

@HariPrasad Я обновил вопрос с файлами. Дайте мне знать, что вы думаете. – JokerMartini

ответ

1

Ну, основываясь на вас текущей реализации, вы должны иметь способ определить тип объекта, независимо от источника. Поэтому проще всего создать объект-оболочку, который вы контролируете, и можете добавить любую информацию, которую вы хотите отслеживать. Что-то вроде этого:

public class NexusItem 
{ 
    public object Item { get; set; } 
    public Brush Background { get; set; } 
} 

Затем измените метод UpdateItems, чтобы добавить данные отслеживания:

 private static void UpdateItems(NexusEditor editor) 
    { 
     editor.Items.Clear(); 

     var sourceB = editor.SourceB as IEnumerable; 
     if (sourceB != null) 
     { 
      foreach (object obj in sourceB) 
      { 
       var item = new NexusItem() { Item = obj, Background = new SolidColorBrush(Colors.Green) }; 
       editor.Items.Add(item); 
      } 
     } 

     var sourceA = editor.SourceA as IEnumerable; 
     if (sourceA != null) 
     { 
      foreach (object obj in sourceA) 
      { 
       var item = new NexusItem() { Item = obj, Background = new SolidColorBrush(Colors.Red) }; 
       editor.Items.Add(item); 
      } 
     } 
    } 

Теперь вы можете обновить свой шаблон для привязки к данным вы ожидаете:

<DataTemplate> 
    <TextBlock Background="{Binding Background}" Grid.Column="1" Grid.Row="1" 
       Text="{Binding Item.Name}" 
       HorizontalAlignment="Center" VerticalAlignment="Center" /> 
    </DataTemplate> 

enter image description here

Теперь, сказав это, я думаю, вы столкнетесь с другими проблемами и ограничения, основанные на вашей текущей архитектуре управления, поскольку вы уже делаете предположения о входящих объектах в своих шаблонах. Может быть, вы этого не сделаете, и это будет соответствовать вашим потребностям.

+0

Мои шаблоны являются временными, я собираюсь в конечном итоге сделать их так, чтобы пользователь мог их определить. Таким образом, они могут контролировать то, что связано, а что нет. – JokerMartini

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