Wpf mvvm binding 문제

제가 wpf 에서 tab control을 사용중에

1번 tab item에서 datagrid 에 있는 데이터 하나를 더블클릭 했을경우, 그 데이터 값이
2번 tab item으로 이동시키려는 작업을 하는중입니다.

public void MoveresultTab(object obj)
{
MainViewModel.ChangeResults = true;

        Time = Records[SelectedValue].Time; //records tab(1번tab)에 있는 time을 옮기기
    }

저렇게 tab을 이동시킨 후,

public string _time ;
    public string Time
    {
        get { return _time; }
        set
        {
            _time = value;
            OnPropertyChanged("Time");
        }
    }

이렇게 바인딩 시켜놓은 time을 적용시키려 했는데

디버깅을 해보면 _time, Time 값들은 바뀌어도 UI에선 값이 바뀌지 않더라구요… 왜그럴까요 ㅠㅠ

2개의 좋아요

@머플러 환영합니다 :smile:

혹시 소스코드 내용을 좀 더 알려주실 수 있으실까요?
간소화 해서 보여주셔도 좋고요.

디버깅으로 set Time 값이 문제 없음은 확인하셨으니,
TabControl과 {Binding Time}을 포함하는 Xaml 화면을 봐야 알 것 같습니다.

혹시 MoveresultTab() 함수가 비하인드 코드에서 실행하나요?
내용에 MainViewModel.ChangeResults = true; 가 있는 걸로 봐선 VM은 따로 있는 것 같은데,
이곳의 Time에 값을 업데이트하고 있는 것 같아서요.

비하인드 코드는 기본적으로 XAML과 같이 만들어지는 cs 파일입니다
(ex, MainWindow.xaml.cs).

만약 비하인드 코드에 쓰셨다면 해당 컨트롤에 직접 값을 업데이트하거나 비하인드 코드 자체가 VM이 되어야 합니다.
가장 간단한 해결 방법으로는 맨 아래쪽에 쓰신 TimeMainViewModel에 똑같이 정의하면 될 것 같아요.

1개의 좋아요

TabControl TabStripPlacement=“Left” HorizontalAlignment=“Left” Height=“658” Margin=“10,32,0,0” VerticalAlignment=“Top” Width=“1294”
TabItem Header=“Data”
Grid Background=“#FFE5E5E5
TextBlock HorizontalAlignment=“Left” Height=“27” Margin=“10,45,0,0” Text=“{Binding Time}” TextWrapping=“Wrap” VerticalAlignment=“Top” Width=“113” DataContext=“{Binding page1}”/
/Grid
/TabItem
/TabControl

이렇게 xaml을 달았습니다!코드로 표시

1개의 좋아요

Time 만 MainViewModel 옮겨도 안되네요… 맨처음 _time = “1” 이렇게 해놓으면 1은 들어가있는데
갱신이 안되는거같기도해요…

1개의 좋아요

@머플러 전체 소스코드를 올려주시거나 구체적으로 작업을 말씀해주시면 샘플 만들어드릴 수 있어요!

그리고 이 문서 참고하시면 질문 작성하실 떄 코드를 좀 더 가독성 있게 올리실 수 있습니다.

Markdown 코드가 포함된 문서 작성 요령

2개의 좋아요

지금 제가생각하는 문제는

tabcontrol 에서 tab item1 번과 tabitem 2번을 서로 다른 ViewModel과 xaml 을 만들고,

tabItem 1번의 datagrid에서 더블클릭한것이
tabitem 2번에 그 정보들이 출력되게 하는건데

이 더블클릭하고 출력되게 하는 과정은 또다른 ViewModel에서 실행을 하게되어서
서로 바인딩된것들끼리 영향을 못주는거같아요. static말고 다른방법이있나요?

1개의 좋아요

@머플러 아하 알겠네요. :smile:
두 탭이 물리적으로 다른 ViewModel을 사용하고 있다면 말씀하신 것 처럼 static으로 처리할 수도 있지만 Binding을 이용하여 다양하게 접근도 가능합니다. 이따가 간단하게 샘플 만들어드릴게요.

너무 친절하십니다…! 샘플기다리겠습니다 감사해요!

1개의 좋아요

샘플 올려드렸습니다. :smile:

설명은 이따가 아래 더 적어놓을게요.

소스코드

1개의 좋아요

원인을 대략 알 것 같은데 뭔가 말로 설명하기 굉장히 어려운 케이스네요…
Github 같은 곳에 코드를 올리셔서 다른 분께 도움을 받는 것이 가장 좋을 것 같아요.

1개의 좋아요

주신 코드 잘 받았습니다 감사합니다!
지금 봤는데 1개의 xaml에서 작동하는거랑 tab마다 서로다른 xaml에서 작용하는게 같을지는 모르겠지만
한번 참고삼아 해보겠습니다…!

1개의 좋아요

@머플러
해보시고 더 말씀해주시면 소스 계속 고쳐볼게요. :smile: