WPF OnPropertyChanged 질문드립니다

WPF 공부중입니다.

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

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

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

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

1개의 좋아요

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개의 좋아요

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

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

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

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

참고 부탁드립니다.

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

1개의 좋아요

이런방법으론 처음 봤던지라…
머리로 생각하고 답변달고
혹시나해서 바로 테스트 돌려보았는데 정상적으로 되네요.
덕분에 상기됬네요 :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개의 좋아요

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

2개의 좋아요

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

2개의 좋아요

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

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

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