MVVM (с WPF) - привязка нескольких представлений к одной и той же модели представления

private void MainForm_Load(object sender, EventArgs e)
{
     FormSplash splash = new FormSplash();
     splash.Show();
     splash.Update();
     System.Threading.Thread.Sleep(3000);
     splash.Hide();
}

Я получил это из Интернета где-то, но не могу найти его снова. Простой, но эффективный.

14
задан Simon_Weaver 26 August 2010 в 00:01
поделиться

3 ответа

Спасибо, что указал мне правильное направление! Я тоже новичок в WPF и знакомлюсь со всеми возможностями, в том числе и с методами связывания. Во всяком случае, для всех интересующихся, вот решение, к которому я пришел в данном конкретном случае:

Я решил, что хочу сохранить модели просмотра разделенными на два подкласса AddIndividualViewModel и EditIndividualViewModel, которые выставляют только команды, вместо того, чтобы пытаться управлять состоянием в одном классе. Однако я хотел один вид, чтобы не дублировать XAML. В итоге я использовал два DataTemplates и DataTemplateSelector для переключения кнопок действий в зависимости от модели представления:

        <DataTemplate x:Key="addTemplate">
            <Button Command="{Binding Path=AddCommand}">Add</Button>
        </DataTemplate>

        <DataTemplate x:Key="editTemplate">
            <Button Command="{Binding Path=UpdateCommand}">Update</Button>
        </DataTemplate>

        <TemplateSelectors:AddEditTemplateSelector
            AddTemplate="{StaticResource addTemplate}"
            EditTemplate="{StaticResource editTemplate}"
            x:Key="addEditTemplateSelector" />

и ведущего контента внизу формы:

        <ContentPresenter Content="{Binding}"
                          ContentTemplateSelector="{StaticResource addEditTemplateSelector}" />

Вот код для селектора шаблонов:

class AddEditTemplateSelector : DataTemplateSelector
{
    public DataTemplate AddTemplate { get; set; }
    public DataTemplate EditTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is AddIndividualViewModel)
        {
            return AddTemplate;
        }
        else if (item is EditIndividualViewModel)
        {
            return EditTemplate;
        }

        return null;
    }
}

Это может быть, а может и не быть, как реализована конечная вещь (учитывая требования), но приятно видеть, что у меня есть такая возможность.

.
5
ответ дан 1 December 2019 в 15:21
поделиться

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

Для справки вы можете посмотреть на Sacha Barber's DataWrapper class, который является частью его Cinch framework (не относится непосредственно к вашему случаю, но является хорошей отправной точкой), который обертывает поля данных в модели представления таким образом, чтобы поддерживать флаг переключения между режимами только чтения (режим просмотра записи) и чтения-записи (режим редактирования записи). Вы можете применить аналогичный подход, чтобы различать добавление и редактирование.

В основном, вместо того, чтобы иметь простые свойства в модели представления, создайте класс обертки данных, который включает в себя свойство Value, и свойство IsAdding. На ваш взгляд, вы можете использовать привязки, триггеры или селекторы шаблонов для изменения шаблонов на основе этого свойства.

.
0
ответ дан 1 December 2019 в 15:21
поделиться

Для этой задачи вам вообще не нужен DataTemplateSelector.

  1. Унаследовать EditIndividualVM и AddINdividualVM от IndividualVM.
  2. Edit- и AddCommands направляют к свойству установки в IndividualVM.
  3. Установщик VM = new AddIndividualVM или VM = new EditIndividualVM в зависимости от того, какая кнопка нажата.
  4. В xaml вы привязываете контентную сетку к свойству виртуальной машины следующим образом:

0
ответ дан 1 December 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: