Эффективный способ создания элементов представления WPF по требованию с помощью флага VM - PullRequest
0 голосов
/ 31 октября 2018

Обычно элементы моего представления создаются стандартным методом привязки ControlControl.Content к свойству, которое содержит виртуальную машину или ноль. Это хорошо, потому что WPF будет создавать элемент представления (через неявный DataTemplate) только в том случае, если виртуальная машина действительно существует.

У меня есть еще один фрагмент пользовательского интерфейса, видимость которого переключается с помощью флага VM. Обычно я бы использовал boolToVisibilityConverter для этого. Тем не менее, этот кусок пользовательского интерфейса достаточно дорогой для создания и редко появляется.

Вместо этого я хочу пойти на расходы на конструкцию вида, только если флаг включен. Я придумал следующее:

<ContentControl>
    <ContentControl.Style>
        <Style TargetType="ContentControl">
            <Style.Triggers>
                <DataTrigger Binding="{Binding SomeVMFlag}" Value="True">
                    <Setter Property="Content">
                        <Setter.Value>
                            <vw:ExpensiveView/>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

Это кажется довольно неуклюжим, и я не могу не чувствовать, что есть лучший способ? Есть предложения?

1 Ответ

0 голосов
/ 31 октября 2018

Согласно динамоиду и предложению Клеменса. Я реализовал отдельное фиктивное свойство VM, которое просто возвращает родительскую VM, когда установлен флаг.

Вид тогда просто:

<ContentPresenter Content="{Binding DummyExpensiveVM}">
    <ContentPresenter.ContentTemplate>
        <DataTemplate>
            <vw:ExpensiveView />
        </DataTemplate>
    </ContentPresenter.ContentTemplate>
</ContentPresenter>

Много чище, большое спасибо обоим.

РЕДАКТИРОВАТЬ : Нет! Это работает НЕ , поскольку шаблон является литералом и создается независимо от содержимого. Я подозреваю, что то же самое верно и для моей первоначальной реализации.

Вместо этого шаблон должен быть неявным шаблоном, определенным в ресурсах представления, как это обычно делается для MVVM.

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