Использование ViewModel в качестве WPF DataContext Устранение проблем - PullRequest
0 голосов
/ 28 сентября 2011

Просто начинайте использовать WPF / MVVM и задайте вопрос об использовании модели представления в качестве текстового контекста для окна wpf.

Я использую первый подход, и мой взгляд выглядит так:

<Window x:Class="TestContext.TestForm"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="TestForm" Height="300" Width="300"
    DataContext="{StaticResource testViewModel}">
    <Grid>
        <TextBox Text="{Binding Path=Address}" Height="23" HorizontalAlignment="Left" Margin="34,44,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
   </Grid>
</Window>

и я создаю свою модель представления в таком коде;

public class ViewModelFactory
{
    public TestViewModel CreateTestViewModel()
    {
        return new TestViewModel();
    }
}

Я использую следующий подход в app.xaml для создания экземпляра модели представления всякий раз, когда я создаю экземпляр представления;

<ObjectDataProvider x:Key="testViewModel" ObjectInstance="{StaticResource viewModelFactory}" MethodName="CreateTestViewModel">

Это все отлично работает.

Проблема в том, что я вижу когда-либо созданную модель только один раз. Поэтому новые экземпляры представления используют тот же экземпляр модели представления.

Я бы хотел начать с нового экземпляра модели представления.

Если я создаю модель представления вручную в конструкторе форм;

public TestForm()
{
    InitializeComponent();
    this.DataContext = new TestViewModel();
}

тогда все работает как положено.

Я пытаюсь понять, что здесь происходит ...

Спасибо ....

Ответы [ 4 ]

1 голос
/ 28 сентября 2011

Честно говоря, использование ObjectDataProvider не является хорошей идеей для получения моделей представлений, поскольку этот экземпляр является единичным для App.

Но если вы настаиваете на воссоздании моделей просмотра, вам придется обновить testViewModel.

То, как вы делаете это testViewModel.Refresh();

0 голосов
/ 29 сентября 2011

В коде

  1. Создайте свой вид
  2. Создание одного свойства при просмотре (называется VM)
  3. Создайте свою модель просмотра
  4. Назначить новую модель просмотра для VM
  5. Установить для DataContext значение ViewModel
  6. Настройте привязки в XAML так, чтобы они указывали на правильные свойства модели представления

Как правило

  1. Я никогда не использую ObjectDataProviders и не создаю экземпляры чего-либо в XAML (слишком глючно)
  2. Всегда используйте шаблон MVVM
  3. Будьте осторожны со статическими ресурсами - они устанавливаются только один раз для экземпляра приложения, где динамические ресурсы могут обновляться
0 голосов
/ 28 сентября 2011

Вы можете создать экземпляр вашей модели представления в разделе ресурсов вашего представления. Как только вы создадите новый вид - вы получите новую модель вида.

Более того, вы получите статические привязки, которые немного производительны и удобны в использовании, потому что вы получите intellsense.

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:WpfApplication1="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <WpfApplication1:MyViewModel x:Key="ViewModel"/>
    </Window.Resources>
    <Grid DataContext="{StaticResource ViewModel}">
        <ItemsControl ItemsSource="{Binding Data}"/>
    </Grid>
</Window>
0 голосов
/ 28 сентября 2011

Да, согласен с @AngelWPF. Вы должны использовать set DataContext как View.DataContext = ViewModel;

...