Как обновить представление из модели представления в WPF, используя дизайн MVVM - PullRequest
7 голосов
/ 09 мая 2011

Я использую WFP с MVVM-дизайном для моего первого проекта, и у меня возникла проблема с обновлением представления после обработки команды от клиента для обновления сущности.В это время представление может взаимодействовать с моделью представления, но модель представления не может вернуться к просмотру.У кого-нибудь есть идеи, как заставить это работать?Спасибо, Jdang

Ответы [ 4 ]

3 голосов
/ 09 мая 2011

Если вы новичок в шаблоне MVVM, я рекомендую следующие отличные ресурсы от MSDN, которые охватывают как шаблон, так и способ его реализации в приложениях WPF и Silverlight:

  1. Реализация шаблона MVVM
  2. Расширенные сценарии MVVM

Исходя из того, что вы сказали, может показаться, что вы захотите просмотреть привязку данных и как вы можете использовать INotifyPropertyChanged , INotifyCollectionChanged , и ICollectionView интерфейсы для обеспечения двусторонней связи между вашими представлениями и моделями представлений.

Привязка данных Silverlight и WPF поддерживает несколько режимов привязки данных. При односторонней привязке данных элементы управления пользовательского интерфейса могут быть привязаны к модели представления, чтобы они отражали значение базовых данных при визуализации отображения. Двусторонняя привязка данных также автоматически обновляет базовые данные, когда пользователь изменяет их в пользовательском интерфейсе. Чтобы обеспечить актуальность пользовательского интерфейса при изменении данных в модели представления, он должен реализовать соответствующий интерфейс уведомлений об изменениях.

3 голосов
/ 09 мая 2011

Вы должны заставить ViewModel реализовать INotifyPropertyChanged и вызвать событие PropertyChanged при изменении свойств ViewModel. Предполагая, что пользовательский интерфейс привязан к свойствам ViewModel, это должно работать.

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

В типичном приложении MVVM вы используете привязки для соединения представления с ViewModel.Привязки автоматически обновляются, когда ViewModel вызывает событие PropertyChanged, определенное интерфейсом INotifyPropertyChanged.Поэтому вам нужно реализовать этот интерфейс в ViewModel и вызвать событие PropertyChanged, когда значение свойства будет изменено, и представление автоматически отразит это изменение.

1 голос
/ 09 мая 2011

Помимо к другим ответам, я бы также предложил расширить ваши ViewModels DependencyObject .

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

Вот мой фрагмент DP (сохранить как DependencyProperty.snippet в C: \ Users [ВАШЕ ИМЯ ЗДЕСЬ] \ Documents \ Visual Studio [2010, 2008] \ Фрагменты кода \ Visual C # \ Мои фрагменты кода):

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
      <Title>SnippetFile1</Title>
      <Author>will</Author>
      <Description>
      </Description>
      <HelpUrl>
      </HelpUrl>
      <Shortcut>dp</Shortcut>
    </Header>
    <Snippet>
      <Declarations>
        <Literal Editable="true">
          <ID>PropertyName</ID>
          <ToolTip>Property name</ToolTip>
          <Default>PropertyName</Default>
          <Function>
          </Function>
        </Literal>
        <Literal Editable="false">
          <ID>ClassName</ID>
          <ToolTip>Class name</ToolTip>
          <Default>ClassName</Default>
          <Function>ClassName()</Function>
        </Literal>
        <Literal Editable="true">
          <ID>Type</ID>
          <ToolTip>Property type</ToolTip>
          <Default>object</Default>
          <Function>
          </Function>
        </Literal>
        <Literal Editable="true">
          <ID>DefaultValue</ID>
          <ToolTip>Default value</ToolTip>
          <Default>null</Default>
          <Function>
          </Function>
        </Literal>
      </Declarations>
      <Code Language="csharp"><![CDATA[#region $PropertyName$
/// <summary>
/// The <see cref="DependencyProperty"/> for <see cref="$PropertyName$"/>.
/// </summary>
public static readonly DependencyProperty $PropertyName$Property =
    DependencyProperty.Register(
        $PropertyName$Name, 
        typeof($Type$), 
        typeof($ClassName$), 
        new UIPropertyMetadata($DefaultValue$));

/// <summary>
/// The name of the <see cref="$PropertyName$"/> <see cref="DependencyProperty"/>.
/// </summary>
public const string $PropertyName$Name = "$PropertyName$";

/// <summary>
/// $end$
/// </summary>
public $Type$ $PropertyName$
{
    get { return ($Type$)GetValue($PropertyName$Property); }
    set { SetValue($PropertyName$Property, value); }
}
#endregion  ]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...