2016-12-14 1 views
0

그래서 ViewModel의 속성을 TextBox의 속성에 바인딩했으며 INotifyPropertyChanged 구현을 사용하여 알맞은 위치에 알림을 표시합니다. 그러나 TextBox에서 데이터가 업데이트되지 않습니다. 내 오류는 어디에 있습니까?C# 6.0에서 INotifyPropertyChanged 구현 - 왜 결과가 없습니까?

// ViewModel 
namespace App1 
{ 
    public class Result 
    {   
     public string Message { get; set; } 
    } 

    public class ResultViewModel : INotifyPropertyChanged 
    { 
     private StringBuilder sb = new StringBuilder(); 
     private CoreDispatcher dispatcher; 

     public event PropertyChangedEventHandler PropertyChanged;   
     protected void OnPropertyChanged([CallerMemberName] string propertyName = "") => 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 

     public string Results 
     { 
      get { return sb.ToString(); } 
     } 

     public int Count() 
     { 
      return sb.Length; 
     } 

     public ResultViewModel() 
     { 
      dispatcher = CoreWindow.GetForCurrentThread().Dispatcher; 
     } 

     public async Task Clear() 
     { 
      await dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => sb.Clear()); 
     } 

     public async Task Add(Result result) 
     { 
      await dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => sb.Append(result.Message));    
      OnPropertyChanged(nameof(Results)); 
     } 
    } 
} 

추가 다음과 같이 MainPage.xaml.cs를에 함수에 의해 호출됩니다 ... 텍스트 상자은 다음과 같습니다에 관해서는

private async void ShowResult(Result result) 
{ 
    await this.ViewModel.Add(result); 
} 

...

// XAML 
<TextBox x:Name="content" 
        Margin="0,10,0,10" 
        RelativePanel.AlignLeftWithPanel="True" 
        RelativePanel.Below="header" 
        RelativePanel.AlignRightWithPanel="True" 
        RelativePanel.Above="genButton" 
        TextWrapping="Wrap" 
        Text="{Binding Path=ViewModel.Results, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
        TextChanged="content_TextChanged"/> 
+2

바인딩은 'OneWay'모드를 사용합니다. 바인딩이가는 "방법"에 대해 확신합니까? – Abion47

+4

누가'Add()'메서드를 호출하고 있습니까? '[CallerMemberName]'대신'OnPropertyChanged ("Results");를 호출해야합니다. 호출자가 속성이지만 올바른 (속성) 이름이 전달되지 않았다고 가정하고 있습니다. –

+0

정확한 정보가 Invoke에 전달되고 UpdateSourceTrigger가 PropertyChanged를 가리키고 Mode가 TwoWay가되었지만 아직 TextBox에서 데이터를 가져 오지 못했습니다. – dspfnder

답변

1

@JeroenvanLangen은 이미 Add의 서명이 맞지 않는다고 말했습니다.

대신 당신은 알림 방법 속성 이름에 의해 영향을 특정하는 상승 할 수

OnPropertyChanged(nameof(Results)); 

CallerMemberName와 구문은 속성 세터 유용하지 않습니다 분명히 다른 곳에서이 호출

string _test; 
public string Test 
{ 
    get { return _test; } 
    set 
    { 
     _test = value; 
     OnPropertyChanged(); // will pass "Test" as propertyName 
    } 
} 
protected void OnPropertyChanged([CallerMemberName] string propertyName = "") => 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 

예 :

void SomeMethod() 
{ 
    ... 
    OnPropertyChanged(); // will pass "SomeMethod", huh? 
} 

보기는이 알림을 받지만 아무것도하지 않습니다.

힌트 : 당신이 모든 속성을 업데이트하려는 경우 당신은 또한 빈 문자열 ""를 전달할 수 있습니다,이 똑같이 귀하의 경우 작동됩니다 (또는 Count 또한 속성을 확인하고 싶은 경우에, 그것과 다음 하나 개의 통지를 바인딩 "" 업데이트시보기에서 ResultsCount 모두 업데이트).

관련 문제