Как я должен динамически создавать UserControls на окнах WPF? - PullRequest
1 голос
/ 10 мая 2011

Сейчас я работаю с некоторыми материалами WPF.В процессе объединения трех очень похожих форм в одну я столкнулся с проблемой.Код, который я написал, работает, но кажется, что это далеко не лучшее решение, поэтому я решил попросить более широкую аудиторию об обратной связи и / или о лучших решениях.

Некоторая справка
Три формы имеют много общего с XAML и выделенным кодом, но в каждой форме есть раздел, который отличается.Я сохранил весь общий код в одной форме и разделил части, отличающиеся на UserControls, с целью динамической загрузки одной из них в контейнер во время выполнения.Мы используем MVVM, поэтому форма имеет ViewModel, как и новые UserControls.Естественно, ViewModel формы действует как родитель и содержит ViewModel новых UserControls как дочерние.

Сам вопрос
Изначально я использовал ContentControl с DataTemplateSelector для выбора изчисло шаблонов данных, каждый из которых содержал один из пользовательских элементов управления.Свойство из родительской модели представления, привязанное к свойству ContentControl Content, использовалось в DataTemplateSelector, чтобы выбрать, какой DataTemplate использовать.Поскольку я не был слишком увлечен необходимостью установить свойство Content, я переключился на использование Style с DataTriggers в ContentControl, выполняя практически ту же задачу.Тем не менее, мне нужно иметь возможность обходить логическое дерево (для проверки ошибок, если вам интересно), и установка ContentTemplate с помощью любого из методов, по-видимому, не позволяет мне продолжать вдоль логического дерева в UserControl из ContentControlкак только он загружен.UserControl видим в контейнере, и с ним связана правая ViewModel через определение DataTemplate, но ContentControl не имеет логических дочерних элементов, поскольку свойство Content имеет значение null.Итак, решение, к которому я обратился, это проверка соответствующего свойства в родительской модели представления в конструкторе формы и явная реализация одного из UserControls в свойстве ContentControl Content.Как только это будет сделано, я могу перейти логическое дерево в UserControl.Кажется, должен быть лучший способ сделать что-то, чем этот, возможно, какой-то способ сделать все это в XAML.

Итак ...
Есть ли лучший способдинамически выбирать и создавать один из моих UserControls?Звучит ли логично, что моя основная техника разделения частей формы на UserControls логична?Кажется, что это что-то, что должно быть довольно распространенным явлением, повторное использование окна, но изменение некоторых его частей, но я не нашел много в своих путешествиях с Google.Возможно, я не смотрел в нужных местах ...

1 Ответ

2 голосов
/ 11 мая 2011

Я думаю, вы должны смотреть на VisualTree для Контента, а не на LogicalTree.

Кроме того, я не могу точно сказать по вашему вопросу выше, но, похоже, вы искали свой ContentTemplate для своего Контента. Если это так, он не будет работать, потому что это шаблон, поэтому он на самом деле не содержит содержимого. Это все равно что смотреть на Резак Печенья, чтобы найти Печенье.

И как примечание, я предпочитаю использовать DataTemplates, чем DataTriggers. Вам также не нужен DataTemplateSelector

В моем ParentViewModel у меня будет свойство, подобное этому:

private ViewModelBase _currentContent;
public ViewModelBase CurrentContent 
{
    get {return _currentContent;}
    set
    {
        if (value != _currentContent)
        {
            _currentContent = value;
            OnPropertyChanged("CurrentContent");
        }
    }
}

и в XAML для ParentViewModel у меня будет что-то вроде

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

Тогда я бы определил свои шаблоны данных для различных типов подвидовых моделей

<DataTemplate DataType="{x:Type local:SubViewModelA}">
    <local:ViewA />
</DataTemplate>
<DataTemplate DataType="{x:Type local:SubViewModelB}" />
    <local:ViewB />
</DataTemplate>
<DataTemplate DataType="{x:Type local:SubViewModelC}" />
    <local:ViewC />
</DataTemplate>

Чтобы переключить содержимое, я бы изменил свойство мастера CurrentContent на то, что SubViewModel должно отображать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...