WPF OnPropertyChanged 질문드립니다

WPF 공부중입니다.

혼자서 독학으로 조금씩 해보고 있는데

Alarm class에 강제로 적용한 flag Y를 N으로 변경하면 적용이 됩니다…

하지만 SendDataToMap에서 newFlag의 값을 N으로 줬을경우 화면 변경이 안되네요

제가 뭘 잘못했을까요? 도움부탁드립니다.

1 Like

OnPropertyChanged 요청 하는 곳의 Flag는 “Y” 로 고정될 거 같아요~

SendDataToMap() 메서드 호출부분은 어디 있나요?

호출하는곳은 딱히 상관없는거같네요.

호출했을때 newFlag가 “N” 값이 들어오기때문이죠

Alarm class가 생성될때 Flag의 값이 Y이지만

string newFlag가 N값이니

Flag = newFlag;로 값을 N으로 변경했다고 생각하는데

아닌가요?

그냥 재현되는 전체 프로젝트를 올려주세요 ㅎㅎ

소스 올리는건 힘들거같고

private void warning_Click(object sender, MouseButtonEventArgs e)
{
MainDashboardMapViewModel mapViewModel = new MainDashboardMapViewModel();
mapViewModel.SendDataToMap(“Y”);
}

이렇게 호출합니다.

이런 류의 질문은 잘못된 지점을 찾기 위해 몇번의 핑퐁이 오고가고
그 와중에 질문자님 및 답변자님들의 소중한 시간만 쓰게 됩니다.

그래서 그냥 깔끔하게

안되는 부분
해보았던 부분
심플하게 재현되는 프로젝트

만 보여주시면 바로 잘못된 지점을 파악하고 많은 분들이 해결 할 수 있습니다.

원본 소스 노출이 어렵다면 그냥 소스 조각을 올리지 않고,
최소한의 재현이 되는 샘플 프로젝트를 만들어서라도 올려 주시는 것이
질문의 매너가 아닌가 생각 됩니다.


참고로 … 매번 뷰모델 인스턴스를 계속 생성하나요?

3 Likes

WPF는 카테고리가 별도로 존재합니다.

앞으로는 WPF 질문은 WPF 카테고리로 분류하여 질문하시기 바랍니다.

이번에는 제가 카테고리를 변경하겠습니다.

그리고 질문은 예제 프로젝트를 별도로 만들어서 질문을 올리는 것이, 서로 시간을 절약할 수 있는 가장 효과적인 방법이고 그 과정에서 본인이 정리를 하기 때문에 질문하시기 전에 정리하시다가 해결될 수도 있습니다.

참고 부탁드립니다.

바인딩 된 ViewModel 인스턴스를 받아 와야지 새로 만들면 전혀 다른 클래스에 값을 넣는 상황이 된듯 합니다.

1 Like

이런방법으론 처음 봤던지라…
머리로 생각하고 답변달고
혹시나해서 바로 테스트 돌려보았는데 정상적으로 되네요.
덕분에 상기됬네요 :slight_smile:

p.s 참고로 저는
버튼을 눌러서 색상을 Red와 Blue 변경하는 방식으로 테스트했습니다.

xaml

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="auto" />

        </Grid.ColumnDefinitions>
        <Grid.Style>
            <Style TargetType="{x:Type Grid}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Flag}" Value="Y">
                        <Setter Property="Background" Value="Red" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Flag}" Value="N">
                        <Setter Property="Background" Value="Blue" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Grid.Style>
        <Button
            Grid.Column="1"
            Width="100"
            Click="Button_Click" />
    </Grid>

xaml.cs

public partial class MainWindow : Window
{
    MainViewModel vm;
    public MainWindow()
    {
        InitializeComponent ();
        this.DataContext = vm = new MainViewModel();
    }
    bool aa = false;
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        if(!aa)
        {
            vm.SendDataTop ("N");
            aa = true;
            return;
        }
        vm.SendDataTop ("Y");
        aa = false;
    }
}

MainViewModel

 public class MainViewModel : BindableObject
 {
     private Alarm alarm;

     public string Flag
     {
         get => alarm.Flag;
         set
         {
             alarm.Flag = value;
             OnPropertyChanged ("Flag");
         }
     }
     public MainViewModel()
     {
         this.alarm = new ();
     }
     public void SendDataTop(string newFlag)
     {
         this.Flag = newFlag;
     }
 }

BindableObject

public class BindableObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler? PropertyChanged;

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler (this, new PropertyChangedEventArgs (name));
        }
    }
}

Alarm

 public class Alarm
 {
     private string flag = "Y";

     public string Flag
     {
         get => flag;
         set => flag = value;
     }
 }
3 Likes

참고하겠습니다. 감사합니다

2 Likes

제가 생각이 짧았습니다. 질문하는 부분을 잘라서 새 프로젝트로 만들어 다시 한번 질문 올려보겠습니다. 조언 감사합니다.

2 Likes

올려주신거 참고해서 다시한번해보겠습니다. 감사합니다

1 Like
private void warning_Click(object sender, MouseButtonEventArgs e)
{
     MainDashboardMapViewModel mapViewModel = new MainDashboardMapViewModel();
     // this.DataContext = mapViewModel or control.DataContext = mapViewModel
     mapViewModel.SendDataToMap(“Y”);
}

주석 처리부분 참고하시면 좋을거 같네요~