2017-11-10 7 views
1

현재 Fody 속성을 사용하여 MVVM으로 WPF 프로젝트를 만들려고합니다. PropertyChanged가 예상대로 작동하지 않습니다.

public static class Model 
{ 
    public static string text { get; set; } 
} 

public class MainWindowViewModel : INotifyPropertyChanged 
{ 

    public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { }; 

    public static MainWindowViewModel Instance => new MainWindowViewModel(); 

    public string Text { get; set; } 
    /* 
    { 
     get { return Model.text; } 
     set 
     { 
      if (value == Text) 
       return; 

      Model.text = value; 

      PropertyChanged(this, new PropertyChangedEventArgs("Text")); 
     } 
    }*/ 

    public ICommand WSDLBrowseClick { get; set; } 


    public MainWindowViewModel() 
    { 
     WSDLBrowseClick = new RelayCommand(BrowseWSDL); 
    } 


    private void BrowseWSDL() 
    { 
     Text = "Test";   
    } 
} 

<Window x:Class="TestMVVM.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:TestMVVM" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525" 
    DataContext="{x:Static local:MainWindowViewModel.Instance}" 
    x:Name="WindowElement"> 

<StackPanel Orientation="Horizontal">   
    <TextBlock Text="{Binding Text, Mode=TwoWay}" /> 
    <Button Content="Browse" Command="{Binding WSDLBrowseClick}"/> 
</StackPanel> 

는 기본적으로 나는 버튼을 클릭하면 TextBlock의는 "테스트"로 혼용을 보여주고 싶어요. Click-Command가 실행되지만 TextBlock의 텍스트는 변경되지 않습니다. TextBox를 최신 상태로 유지하는 로컬 메모리로 Text 속성을 사용하여 나중에 값을 model.text로 보내고 거기에서 사용할 수 있습니다. 하지만 내가 현재 주석 처리 한 코드를 사용하는 경우에만 작동합니다. fody weaver가 나에게 똑같은 일을하도록되어 있지 않습니까? (단지 model.text를 사용하는 대신 다른 private 변수를 만듭니다)?

+0

올바른지, 위버를 FodyWeavers.xml에 추가 했습니까? PropertyChangedEvent에서 빈 가드 대리자없이 시도해도 Fody가이를 덮어 쓰지 않을 수 있습니다. – Lennart

+0

코드는 Fody 버전 2.1.4를 사용하여 잘 작동합니다. – mm8

답변

0

내 FodyWeavers.xml에 <PropertyChanged/>을 추가하여 작동하도록 만들었습니다.

0

예제에서 알 수 있듯이 클래스에 [ImplementPropertyChanged] 특성을 표시해야합니다.

Source 그것은 당신이 텍스트가 전혀 변경되었음을 통지하지 않는 것 같다

+0

이 속성은 현재 쓸모가 없습니다. 클래스에 INotifyPropertyChanged를 구현하면 충분합니다. – Lennart

0

따라서 뷰는 새로운 값이 단서가 없다!

이 코드를 시도 텍스트 변수 세터의 대신에 (속성 완성은 정신에 대한 논리를 변경) :

public string Text 
    { 
     get => _text; 
     set 
     { 
      OnPropertyChanged(nameof(Text)); 
      _text = value; 
     } 
    } 
    private string _text; 
    public event PropertyChangedEventHandler PropertyChanged; 
    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

PLUS는 말을하기 위해 XAML의 섹션을 업데이트해야합니다

<TextBlock Text="{Binding Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />