前提・実現したいこと
一つのコントロールに複数のプロパティを紐づけたく、DetaTrrigerでDataContextを
切り替えるようにしたのですがうまくいかないです。そもそもこのようなことは可能なのでしょうか?可能であればDataContextのバインドでなくても良いので、いい方法を教えていただけますと幸いです。
発生している問題・エラーメッセージ
基になるDataContextが、初期状態でMeinじゃなくViewModelに変わっていることから、Passが見つからないのがエラーの原因だと考えています。
・ ・ ・ System.Windows.Data Error: 40 : BindingExpression path error: 'Pass' property not found on 'object' ''ViewModel' (HashCode=62883878)'. BindingExpression:Path=Pass; DataItem='ViewModel' (HashCode=62883878); target element is 'TextBlock' (Name=''); target property is 'NoTarget' (type 'Object') Process is terminated due to StackOverflowException. 型 'System.StackOverflowException' のハンドルされていない例外が mscorlib.dll で発生しました
該当のソースコード
C#
1namespace Test 2{ 3 class Mein : BindableBase 4 { 5 public DelegateCommand ButtonPush { get; set; } 6 7 public Mein() 8 { 9 ButtonPush = new DelegateCommand(Push); 10 } 11 12 public ViewModel VM1 { get; set; } = new ViewModel(); 13 public ViewModel VM2 { get; set; } = new ViewModel(); 14 15 bool _pass = false; 16 public bool Pass 17 { 18 get { return _pass; } 19 set { SetProperty(ref _pass, value); } 20 } 21 22 int i = 2; 23 private void Push() 24 { 25 i++; 26 if (i % 2 == 0) Pass = true; 27 else Pass = false; 28 29 VM1.Calculate(i); 30 VM2.Calculate(i); 31 } 32 } 33}
C#
1namespace Test 2{ 3 class ViewModel:BindableBase 4 { 5 int _a = 0; 6 public int A 7 { 8 get { return _a; } 9 set { SetProperty(ref _a, value); } 10 } 11 12 public void Calculate(int c) 13 { 14 int b = 2; 15 A = b * c; 16 } 17 } 18}
XAML
1<Window.DataContext> 2 <local:Mein/> 3 </Window.DataContext> 4 5 <Window.Resources> 6 <Style x:Key="Style" TargetType="{x:Type TextBlock}"> 7 <Style.Triggers> 8 <DataTrigger Binding="{Binding Pass}" Value="true"> 9 <Setter Property="DataContext" Value="{Binding VM1}"/> 10 </DataTrigger> 11 <DataTrigger Binding="{Binding Pass}" Value="false"> 12 <Setter Property="DataContext" Value="{Binding VM1}"/> 13 </DataTrigger> 14 </Style.Triggers> 15 </Style> 16 </Window.Resources> 17 18 <Grid> 19 <Grid.RowDefinitions> 20 <RowDefinition Height="1*"/> 21 <RowDefinition Height="1*"/> 22 </Grid.RowDefinitions> 23 <Button Command="{Binding ButtonPush}" Grid.Row="0" Content="Button" HorizontalAlignment="Center" VerticalAlignment="Center"/> 24 <TextBlock Grid.Row="1" Style="{StaticResource Style}" Text="{Binding A}" HorizontalAlignment="Center" VerticalAlignment="Center" /> 25 </Grid> 26
試したこと
基になるDetaContextがおかしくなっているのが原因だと考えたため、localで元のMeinのデータを参照するようにしたが、これでもうまくできません。
XAML
1<DataTrigger Binding="{Binding Path=(local:Mein.Pass)}" Value="true"> 2<Setter Property="DataContext" Value="{Binding VM1}"/> 3</DataTrigger>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。