WPF - 从对话窗口传递参数到UserControl
问题描述:
我使用DependencyProperty从DialogWindow传递参数到UserControl。 我想要在UserControl构造函数内部的参数传递给视图模型。WPF - 从对话窗口传递参数到UserControl
该属性总是返回null,并且永远不会被设置。
代码:
主窗口:
var dialog = new DialogWindow();
dialog.ShowDialog();
DialogWindow.xaml
<TabControl>
<TabItem Header="Data Source">
<local:DataSourceView Test="Something" />
</TabItem>
</TabControl>
DataSourceView.xaml.cs
public static readonly DependencyProperty TestProperty =
DependencyProperty.Register("Test", typeof(object), typeof(DataSourceView));
public object Test {
get { return (object)GetValue(TestProperty); }
set { SetValue(TestProperty, value); }
}
public DataSourceView() {
InitializeComponent();
DataContext = new DataSourceViewModel(Test);// Test is always null
}
答
可以使用DependencyProperty.Register
方法的重载用PropertyMetadata
这将有一个PropertyChangedCallback
参数并观察数据绑定过程。
public static readonly DependencyProperty TestProperty =
DependencyProperty.Register("Test", typeof(object), typeof(DataSourceView), new PropertyMetadata(TestPropertyChangedCallback
));
private static void TestPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
System.Diagnostics.Debug.WriteLine(e.NewValue);
System.Diagnostics.Debug.WriteLine(e.OldValue);
}
下面的链接包含了一个类似的问题的解决方案:
答
“的属性总是返回null,并且永远不会设置。” - 是错的。 DataSourceView构造函数中的属性为null。 DataSourceView实例创建后,属性将被设置为“Something”。
+0
是的,你说得对,我已经注意到使用在madiden的答案中提出的回调方法。感谢您的回答 :) – IBRA
有类似的情况在这里: [链接](http://*.com/questions/21717600/passing-parameters-between-xaml-window-and-usercontrol-wpf?rq=1) 您应该将DataContext的设置移至Loaded事件处理程序。 – madiden
使用回调方法我发现在View实例完成后,该属性被设置,并使用您在注释中提供的链接,现在我可以访问正确的值。您能否更新您的答案以在评论中包含链接。谢谢:) – IBRA