[WPF] Page Property Binding

안녕하세요.

Page를 프레임에서 Navigate 할 때 Page 내 Property를 바인딩하는 방법에 대해서 질문 드립니다.

[MyPage.xaml]

public partial class MyPage : Page
{
#region dependency property
     public static readonly DependencyProperty StrProperty = DependencyProperty.Register("Str", typeof(string), typeof(MyPage), new PropertyMetadata(null, new PropertyChangedCallback(StrChangedCallback)));
#endregion

#region public property
     public String Str
     {
          get => GetValue(StrProperty) as string;
          set => SetValue(StrProperty, value);
     }
#endregion

#region callback
     private static void StrChangedCallback(object sender, DependencyPropertyChangedEventArgs e)
     {
          if (sender != null && sender is MyPage)
          {
               MyPage mypage = sender as MyPage;
               mypage.OnStrChanged(e.OldValue, e.NewValue);
          }
    }
#endregion

#region protected method
     protected void OnStrChanged(object oldValue, object newValue)
          {
               Str = newValue as string;
          }
#endregion

     public MyPage()
     {
          InitializeComponent();
     }
}
[MainWindows.xaml.cs]

MyFrame.Navigate("MyPage.xaml");

MainWindows에서 MyPage를 정의하는게 아니라서 프로퍼티에 바인딩 거는 방법을 모르겠습니다.

감사합니다

좋아요 1

처음 써본 글인데 코드를 코드 블럭 안에 넣는 법을 정확히 모르겠네요.
가독성 좋지 않은 점 죄송합니다.

좋아요 1

```csharp
코드
```

이렇게 코드를 넣으면 되어요.

좋아요 1

Navigate()에 넘길 수 있는 인자가 있을 겁니다. Page에 오버라이드 메소드가 있을꺼에요 OnNavigatedTo() 이곳에서 넘겨받은 인자를 적용하실 수 있습니다.
정확한 답변을 위해 환경설명을 좀 더 해주시면 좋습니다.

좋아요 1

말씀해주신 대로 수정했습니다.
한결 보기 편해졌네요.
감사합니다.

좋아요 2

단순한 컨트롤이면 xaml에서 해당 컨트롤을 호출하기 때문에 저는 보통 MainWindows.xaml에서 MainWindow의 ViewModel을 작성하고 바인딩 합니다.

<Window 
    ...
    d:DataContext="{d:DesignInstance local:MainViewModel}">
    <Grid>
        <Button Content="{Binding Str, UpdateSourceTrigger=PropertyChanged}"/>
    </Grid>
</Window>

이런식으로요

그런데 MainWindow에 Frame을 생성하고 해당 프레임에 페이지를 Navigate() 할 때 페이지와 MainWindowViewModel의 객체를 바인딩 하는 방법을 모르겠습니다.

<Window 
    ...
    d:DataContext="{d:DesignInstance local:MainViewModel}">
    <Grid>
        <Frame/>
    </Grid>
</Window>
????? <MyPage Str="{Binding Str, UpdateSourceTrigger=PropertyChanged}"/>
``
좋아요 1

아 인자로 안 넘겨주고 바인딩하려는 이유는 MainPage의 Str값이 계속 변하기 때문입니다.

좋아요 1

WPF인가요? Navigate()의 두번째 인자로 값을 전달할 수 있습니다. 바인딩이 목적이시라면 DataContext를 넘겨주시면 될 꺼구요,

해당 Page에서 NavigationServiceLoadCompleted이벤트로 인자를 받을 수 있고,
DataContext를 념거주면 Str를 바인딩해서 표현하실 수 있을꺼에요

좋아요 1

혹시 이것도 도움이 되실 수 있을 것 같아요.

좋아요 1

코드를 조금 더 직관적으로 보이게 하고 싶어서 페이지의 속성을 Navigate 하는 클래스에서 바인딩하고 싶은 건데 제가 설명을 너무 못했네요. 답변주셔서 감사합니다.

좋아요 1