2014-09-16 4 views
0

У меня есть приложение, написанное в WPF (MVVM), которое на основе некоторых условий создаст экземпляры разных UserControls, Эти UserControl полностью независимы, чтобы отображать определенную информацию. У них есть встроенная логика, например таймеры и т. Д., Поэтому я не могу использовать Шаблоны.Привязка к коллекции UserControl

Теперь у меня возникла проблема с тем, что я хочу создать список UserControls в ViewModel и привязать к нему хост-интерфейс. Проблема в том, что я не знаю, как связывать и что связывать. В проекте, отличном от MVVM, вы просто получите макет, в который хотите поместить свои элементы управления, и добавьте их в качестве детей. В приложении MVVM я не знаю, как это сделать. Я предполагаю, что WrapPanel с ItemsSource, который добавит все элементы управления и изменит размер по мере необходимости на основе UserControls.

Может кто-нибудь предложить решение?

EDIT: Мои ViewModel выставляет ObservableCollection из IMyDriver прямо сейчас. Так вот что я подумал, чтобы немного разбить MVVM, чтобы получить следующее: Теперь каждый IMyDriver может быть другим типом драйвера и может реализовывать различные другие интерфейсы. Мне нужен пользовательский интерфейс для создания определенных UserControls, которые знают, как получить максимум от этих драйверов, исходя из их возможностей. Короче говоря, UserControls подключается к устройству через драйвер для опроса данных. И каждый UserControl делает это определенным образом.

+0

* Я хочу создать список UserControls в ViewModel * ... нет, нет и нет! Это не так, как работает MVVM, поэтому либо измените свой подход, либо удалите тег MVVM из вашего вопроса ... вы не можете иметь его в обоих направлениях. – Sheridan

+1

DataTemplates связывает типы VM с UserControls. Bam. Готово. – Will

+0

Будет ли этот ответ вместе с Шериданом заставил меня думать в правильном направлении. Большое спасибо! – XMight

ответ

0

На основании того, что Will прокомментировал и что ответил Sheridan, я нашел решение моей проблемы.

Итак:

  1. я не нарушаю MVVM, оставляя нетронутыми типы ViewModel.

  2. Я создаю DataTemplates в ресурсах теге моего окна, и в каждом шаблоне данных, Поручаю DataTemplate быть мой UserControl определен в другой сборке (UICommons)

    <DataTemplate x:Key="IMultiChannelMeasurementDCDataTemplate"> 
        <uicommon:MeasurementMax8ChannelMonitoringUserControl/> 
    </DataTemplate> 
    
  3. Я создаю селектора шаблонов в моей сборка приложений, а также на основе интерфейсов типов данных реализации, я возвращаю правую DataTemplate, что я назначаю в теге ресурсов одного и того же окна

    <!-- DataTemplate Selector --> 
    <local:DriverComponentDataTemplateSelector x:Key="templateSelector" 
         DefaultDCDataTemplate="{StaticResource DefaultDCDataTemplate}" 
         IIhcDCDataTemplate="{StaticResource IIhcDCDataTemplate}" 
         IMultiChannelMeasurementDCDataTemplate="{StaticResource IMultiChannelMeasurementDCDataTemplate}" 
         IProgrammablePowerSourceDCDataTemplate="{StaticResource IProgrammablePowerSourceDCDataTemplate}" 
         IEnvDCDataTemplate="{StaticResource IEnvDCDataTemplate}"/> 
    
  4. Я создать ItemsControl в окне, с помощью следующего кода XAML, который связывает себя с моего ObservableCollection пунктов

    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled"> 
        <ItemsControl ItemTemplateSelector="{StaticResource templateSelector}" ItemsSource="{Binding DriverComponentsInfo}"> 
         <ItemsControl.ItemsPanel> 
          <ItemsPanelTemplate> 
           <WrapPanel Orientation="Horizontal" x:Name="ucWrapPanel"> 
           </WrapPanel> 
          </ItemsPanelTemplate> 
         </ItemsControl.ItemsPanel>    
        </ItemsControl> 
    </ScrollViewer> 
    
  5. Наслаждается динамически создаваемые UserControls на основе различных драйверов!

P.S. Я поддержал комментарий Will и ответ Sheridan, потому что без них я не смог бы найти решение. Спасибо!

0

У них есть некоторая пользовательская логика внутри, например, таймеры и т. Д., Поэтому я не могу использовать Шаблоны.

Это не следует. Я думаю, что у вас может быть неправильное представление о возможностях WPF.

Кроме того, поскольку вы хотите использовать MVVM: привязка к списку UserControls нарушает шаблон. Модели просмотра должны всегда ссылаться только на другие модели представлений (и модели); они ничего не знают о пользовательском интерфейсе. Привяжите к коллекции моделей-представлений, которые связаны с их UserControls (рассмотрите возможность использования implicit DataTemplates). Чтобы связать WrapPanel, вы используете ItemsControl и установите его ItemsPanel соответственно.

1

Вы можете сделать это довольно просто и легко объявить конкретные классы типов данных для данных в каждом UserControl и определить DataTemplate сек, открывающие свои UserControl сек в App.xaml файле:

<DataTemplate DataType="{x:Type YourViewModelsPrefix:YourViewModel"> 
    <YourViewsPrefix:YourView /> 
</DataTemplate> 
<DataTemplate DataType="{x:Type YourViewModelsPrefix:YourOtherViewModel"> 
    <YourViewsPrefix:YourOtherView /> 
</DataTemplate> 
<DataTemplate DataType="{x:Type YourViewModelsPrefix:AnotherViewModel"> 
    <YourViewsPrefix:AnotherView /> 
</DataTemplate> 

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

<ContentControl Content="{Binding YourViewModelProperty}" /> 

...

public YourBaseViewModelClass YourViewModelProperty { get; set; } 

Убедитесь, что все ваши модели зрения расширить этот класс:

public YourViewModel : YourBaseViewModelClass { } 
... 
public AnotherViewModel : YourBaseViewModelClass { } 

Затем вы можете поменять каждый вид модель (и отображать каждый связанный вид), как это:

YourViewModelProperty = new AnotherViewModel(); 
Смежные вопросы