2011-05-09 2 views
7

MVV 디자인의 첫 번째 프로젝트에 WFP를 사용하고 있으며 엔터티를 업데이트하기 위해 클라이언트의 명령을 처리 한 후 뷰를 업데이트하는 데 문제가 있습니다. 현재 뷰는 뷰 모델과 대화 할 수 있지만 뷰 모델은 다시 볼 수 없습니다. 누구나 어떻게 작동하는지 알 수 있습니까? 감사, JdangMVVM 디자인을 사용하여 WPF의 뷰 모델에서 뷰를 업데이트하는 방법

+0

죄송합니다.이 문제가 해결 되었습니까? 나는 같은 것을 고집했다. – curiousity

답변

3

ViewModel 속성을 변경하면 INotifyPropertyChanged를 구현하고 PropertyChanged 이벤트를 발생시켜야합니다. UI가 ViewModel 프로퍼티에 묶여 있다고 가정하면 이것이 작동합니다.

2

일반적인 MVVM 응용 프로그램에서 바인딩을 사용하여 뷰를 ViewModel에 연결합니다. ViewModel이 INotifyPropertyChanged 인터페이스로 정의 된 PropertyChanged 이벤트를 발생 시키면 바인딩이 자동으로 업데이트됩니다. 따라서 ViewModel에서 해당 인터페이스를 구현하고 속성 값이 변경되면 PropertyChanged 이벤트를 발생시켜야하며,보기에는 변경 사항이 자동으로 반영됩니다.

+0

예, INotifyPropertyChanged를 구현하고 PropertyChanged 이벤트를 발생 시키지만 뷰에는 아무런 변화가 없다. 나는 특별한 것을해야만한다. 현재 내가 가진 것은 – AustinTX

+0

예, INotifyPropertyChanged를 구현하고 PropertyChanged 이벤트를 발생 시키지만 아무 것도 변경하지 않습니다. 나는 특별한 것을해야만한다. 현재 여기 내 xaml Text = "{바인딩 사용자.UserName, Mode = TwoWay, UpdateSourceTrigger = PropertyChanged} "내가보기에 어떤 예가 있습니까? – AustinTX

+0

당신이 가지고있는 것과 함께 작동해야합니다 ... 더 많은 코드를 포함하도록 질문을 편집 할 수 있습니까? –

3

당신이 MVVM 패턴을 처음 사용하는 경우에, 나는 패턴과 방법 WPF와 실버 라이트 응용 프로그램에서이를 구현하는 방법을 모두 포함 MSDN에서 다음과 같이 우수한 자원 좋습니다

  1. Implementing the MVVM Pattern
  2. Advanced MVVM Scenarios
당신이 말한 것을, 당신이 data binding을 검토 할 수 있습니다처럼 소리, 당신은 INotifyPropertyChanged, INotifyCollectionChanged,을 어떻게 활용할 수 있는지를 바탕으로

d ICollectionView 인터페이스를 사용하여보기와보기 모델 간의 양방향 통신을 가능하게합니다.

Silverlight 및 WPF 데이터 바인딩은 여러 데이터 바인딩 모드를 지원합니다. 단방향 데이터 바인딩을 사용하면 UI 컨트롤을 뷰 모델에 바인딩하여 디스플레이 렌더링시 기본 데이터의 값을 반영 할 수 있습니다. 양방향 데이터 바인딩은 사용자가 UI에서 수정할 때 기본 데이터를 자동으로 업데이트합니다. 뷰 모델에서 데이터가 변경 될 때 UI가 최신 상태로 유지되도록하려면 적절한 변경 알림 인터페이스를 구현해야합니다.

+0

예, 구현했습니다. INotifyPropertyChanged 및 PropertyChanged 이벤트가 발생하지만보기에 아무 것도 변경되지 않습니다. 볼 수있는 특별한 작업을 수행해야합니까. 현재 Text = "{User.UserName, Mode = TwoWay, UpdateSourceTrigger = PropertyChanged} 바인딩" – AustinTX

+1

바인딩 올바른 것으로 보입니다. 중단 점을 설정하여 UserName 속성을 변경할 때 PropertyChanged가 발생했는지 확인했는지, 이벤트에 올린 속성의 텍스트 이름이 속성 이름과 정확하게 일치하는지 다시 확인하십시오. 원하는 경우 모델을보고 문제를 디버그하는 데 도움이됩니다. – Oppositional

1

다른 답변에 또한 ViewModels을 DependencyObject으로 확장하는 것이 좋습니다.

일부 사용자는 DependencyObjects가 많은 가중치를 갖고 있다고 믿습니다. (또한 수천 개의 인스턴스를 만드는 경우에도 가능합니다.) 새로운 사용자의 경우 약간 복잡합니다 (가장 확실한 경우가 있습니다). 그러나 DependencyObjects에는 속성 변경 알림에 대한 자동 지원 및 바인딩 평가 속도와 같은 다른 이점이 있습니다.

가 여기 내 DP 조각의 (C에서 DependencyProperty.snippet로 저장 : [여기 NAME] 사용자를 \ \ 문서 [2010, 2008] \ 코드 조각 내 코드 조각 \ 비주얼 C# \ Visual Studio를 \) :

<?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> 
+0

DependencyObject를 사용하여 성능 이점을 얻는 것에 동의합니다. b 그들은 생성 된 스레드에 바인딩되고 종속성 객체는 직렬화 할 수 없습니다. 어떤 경우에는 확실히 갈 길이지만, 일반적으로 알림 인터페이스와 함께 POCO를 사용하는 것이 더 안전합니다 (여전히 상대적으로 성능이 좋습니다). – Oppositional

+0

관심있는 사람들을 위해 http://msdn.microsoft.com/en-us/library/bb613546.aspx#HowDataBindingReferencesAreResolved는 의의가 성능에 미치는 영향에 대한 적절한 정보를 제공합니다. – Oppositional

관련 문제