各コントロールのDataContextプロパティは、自分自身にDataContextが設定されていない場合は、
親要素を辿っていってその親のDataContextを利用するという認識です。
例えばMainWindow.xamlのDataContextにMainWindowViewModelを設定した場合は、
MainWindow内に配置したtextboxやbuttonなどのDataContextにもMainWindowViewModelが設定されると思っています。
その流れで、以下のようにNavigationWindowのSourceにPage0を設定し、
Page0のDataContextにPage0ViewModelを指定しました。
Page0はさらにFrameで二つにわけてPage1とPage2を設定しています。
この場合、Page1とPage2のDataContextはPage0ViewModelになるはずだと思っていたのですが
実際にはnullになっているようです。
・そもそも親のDataContextを引き継ぐという理解が誤っているのでしょうか?
・Page1とPage2のDataContextに、Page0と同じPage0ViewModelインスタンスを指定するにはどうすればよいでしょうか?
xaml
1MainWindow.xaml 2<NavigationWindow x:Class="FrameTest.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 7 xmlns:local="clr-namespace:FrameTest" 8 mc:Ignorable="d" 9 Title="MainWindow" Height="450" Width="800" 10 Source="Page0.xaml"> 11</NavigationWindow>
xaml
1Page0.xaml 2 <Grid> 3 <Grid.ColumnDefinitions> 4 <ColumnDefinition /> 5 <ColumnDefinition /> 6 </Grid.ColumnDefinitions> 7 <Frame Source="Page1.xaml"></Frame> 8 <Frame Grid.Column="1" Source="Page2.xaml"></Frame> 9 </Grid>
C#
1Page0.xaml.cs 2namespace FrameTest 3{ 4 public partial class Page0 : Page 5 { 6 public Page0() 7 { 8 InitializeComponent(); 9 var Data = new Page0ViewModel(); 10 DataContext = Data; 11 } 12 } 13}
C#
1Page0ViewModel.cs 2namespace FrameTest 3{ 4 class Page0ViewModel 5 { 6 ReactiveProperty<String> TextInput { get; set; } = new ReactiveProperty<String>(); 7 ReactiveProperty<String> TextOutput { get; set; } 8 9 public Page0ViewModel() 10 { 11 this.TextOutput = this.TextInput 12 .Select(s => s != null ? s.ToUpper() : null) 13 .ToReactiveProperty(); 14 } 15 } 16}
xaml
1Page1.xaml 2 <Grid> 3 <TextBox Width="100" 4 Height="100" 5 Text="{Binding TextInput.Value , Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox> 6 </Grid>
xaml
1Page2.xaml 2 <Grid> 3 <TextBlock Width="100" 4 Height="100" 5 Text="{Binding TextOutput.Value}"></TextBlock> 6 </Grid>
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/11 09:11