おそらくダイアログ云々は関係なくて、MainWindow
に置いても出ないんじゃないでしょうか?
現象から推測すると、
XXX.xaml
でAutoWireViewModel="True"
された上XXXViewModel
がある
つまりDataContext
が違うのではないかということです。
XXX.xaml
のParam
を表示するコントロールでRelativeSource
忘れ
DependencyProperty
のParam
を中からバインドするなら、FindAncestor
がいると思いますができていない?
どちらにせよ「出力」ウィンドウや「XAML バインド エラー」ウィンドウに、エラー表示が出ます。
エラーが出ていなければはずれですので、XXX.xaml
・XXX.xaml.cs
も追記してください。
DependencyProperty で実装しており、デバッガ で確認したところ、その setter も呼ばれていない
CLRプロパティラッパーが呼ばれないのは仕様です。直接SetValue
が呼ばれます。
XAML Loading and Dependency Properties - WPF .NET Framework | Microsoft Docs
検証コード
xml:Dialog.xaml
1<UserControl
2 x:Class="Questions309079.Views.Dialog"
3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 xmlns:local="clr-namespace:Questions309079.Views"
6 xmlns:prism="http://prismlibrary.com/"
7 x:Name="dialog"
8 prism:ViewModelLocator.AutoWireViewModel="True">
9 <StackPanel>
10 <GroupBox Margin="5" Header="Dialog VM ⇆ XXX DP">
11 <local:XXX
12 x:Name="XXX"
13 Param1="{Binding DataContext.Param1.Value, ElementName=dialog, Mode=TwoWay}"
14 Param2="{Binding DataContext.Param2.Value, ElementName=dialog, Mode=TwoWay}" />
15 </GroupBox>
16
17 <GroupBox Margin="5" Header="XXX DP ⇆ XXX VM">
18 <local:XXX
19 Param1="{Binding Param1.Value, Mode=TwoWay}"
20 Param2="{Binding Param2.Value, Mode=TwoWay}" />
21 </GroupBox>
22
23 <GroupBox Margin="5" Header="Dialog VM ⇆ XXX DP ⇆ XXX VM">
24 <TextBlock Text="こういうことをしようとしている??
だったらXXX DPもXXX VMもいらんでしょ?という話" />
25 </GroupBox>
26
27 <GroupBox Margin="5" Header="Dialog">
28 <StackPanel>
29 <HeaderedContentControl Header="Dialog VM Param1">
30 <TextBox Text="{Binding Param1.Value, UpdateSourceTrigger=PropertyChanged}" />
31 </HeaderedContentControl>
32 <HeaderedContentControl Header="Dialog VM Param2">
33 <TextBox Text="{Binding Param2.Value, UpdateSourceTrigger=PropertyChanged}" />
34 </HeaderedContentControl>
35 </StackPanel>
36 </GroupBox>
37 </StackPanel>
38</UserControl>
cs:DialogViewModel.cs
1using Prism.Mvvm;
2using Prism.Services.Dialogs;
3using Reactive.Bindings;
4using System;
5
6namespace Questions309079.ViewModels
7{
8 public class DialogViewModel : BindableBase, IDialogAware
9 {
10 public ReactiveProperty<string> Param1 { get; } = new ReactiveProperty<string>("aaa");
11 public ReactiveProperty<string> Param2 { get; } = new ReactiveProperty<string>("bbb");
12
13 public string Title => "Dialog";
14
15 public event Action<IDialogResult> RequestClose;
16
17 public void OnDialogOpened(IDialogParameters parameters)
18 {
19 Param1.Value = "ABC";
20 Param2.Value = "DEF";
21 }
22
23 public void RaiseRequestClose(IDialogResult dialogResult) => RequestClose?.Invoke(dialogResult);
24 public bool CanCloseDialog() => true;
25 public void OnDialogClosed() { }
26 }
27}
xml:XXX.xaml
1<UserControl
2 x:Class="Questions309079.Views.XXX"
3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 xmlns:local="clr-namespace:Questions309079.Views"
6 xmlns:prism="http://prismlibrary.com/"
7 prism:ViewModelLocator.AutoWireViewModel="True">
8 <Grid>
9 <Grid.ColumnDefinitions>
10 <ColumnDefinition />
11 <ColumnDefinition />
12 </Grid.ColumnDefinitions>
13 <StackPanel>
14 <HeaderedContentControl Header="XXX DP Param1">
15 <TextBox Text="{Binding Param1, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:XXX}}, UpdateSourceTrigger=PropertyChanged}" />
16 </HeaderedContentControl>
17 <HeaderedContentControl Header="XXX DP Param2">
18 <TextBox Text="{Binding Param2, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:XXX}}, UpdateSourceTrigger=PropertyChanged}" />
19 </HeaderedContentControl>
20 </StackPanel>
21
22 <StackPanel Grid.Column="1">
23 <HeaderedContentControl Header="XXX VM Param1">
24 <TextBox Text="{Binding Param1.Value, UpdateSourceTrigger=PropertyChanged}" />
25 </HeaderedContentControl>
26 <HeaderedContentControl Header="XXX VM Param2">
27 <TextBox Text="{Binding Param2.Value, UpdateSourceTrigger=PropertyChanged}" />
28 </HeaderedContentControl>
29 </StackPanel>
30 </Grid>
31</UserControl>
cs:XXX.xaml.cs
1using System.Diagnostics;
2using System.Windows;
3using System.Windows.Controls;
4
5namespace Questions309079.Views
6{
7 public partial class XXX : UserControl
8 {
9 public string Param1
10 {
11 get => (string)GetValue(Param1Property);
12 set
13 {
14 Debug.WriteLine($"setter:{Param1}->{value}");
15 SetValue(Param1Property, value);
16 }
17 }
18 public static readonly DependencyProperty Param1Property
19 = DependencyProperty.Register(nameof(Param1), typeof(string), typeof(XXX),
20 new PropertyMetadata(string.Empty, OnParam1Changed));
21 private static void OnParam1Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
22 => Debug.WriteLine($"OnParam1Changed:{e.OldValue}->{e.NewValue}");
23
24
25 public string Param2 { get => (string)GetValue(Param2Property); set => SetValue(Param2Property, value); }
26 public static readonly DependencyProperty Param2Property
27 = DependencyProperty.Register(nameof(Param2), typeof(string), typeof(XXX),
28 new PropertyMetadata(string.Empty));
29
30 public XXX() => InitializeComponent();
31 }
32}
cs:XXXViewModel.cs
1using Reactive.Bindings;
2
3namespace Questions309079.ViewModels
4{
5 public class XXXViewModel
6 {
7 public ReactiveProperty<string> Param1 { get; } = new ReactiveProperty<string>("aaa");
8 public ReactiveProperty<string> Param2 { get; } = new ReactiveProperty<string>("bbb");
9 }
10}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/14 04:25