我有UserControlViewModel
引发一个事件:
public event EventHandler<EventArgs> StuffDone;
在
UserControlViewModel
内部创建并初始化MainPageViewModel
对象:this.userControlViewModel = new UserControlViewModel();
MainPageViewModel
是MainPage
的 View 模型。在MainPage.xaml中,我有以下代码将
UserControlView
UserControl
放入MainPage
并初始化其DataContext
:<views:UserControlView DataContext="{Binding userControlViewModel, Mode=OneWay}" IsHitTestVisible="False"></views:UserControlView>
到目前为止,一切正常。
现在,我想订阅
StuffDone
中的UserControlView
事件。我想到的第一件事是在Loaded
的UserControlView
事件处理程序内执行此操作;但是,此时的DataContext
仍然是null
。扫描其余的UserControl
事件对我一无所知。那么,在哪里获取
DataContext
并订阅其事件的正确位置呢?提前致谢。
最佳答案
UPDATE :Windows 8.1的WinRT中支持DataContextChanged事件。仅当您针对Windows 8的WinRT或不支持DataContextChanged
的任何平台进行编码时,才使用以下代码。
似乎没有简单的方法可以做到,而Will在他的评论中建议的解决方法是最简单的方法。
以下是适用于我的我的解决方法版本:
在IDataContextChangedHandler.Generic.cs中:
using Windows.UI.Xaml;
namespace SomeNamespace
{
public interface IDataContextChangedHandler<in T> where T : FrameworkElement
{
void DataContextChanged(T sender, DependencyPropertyChangedEventArgs e);
}
}
在DataContextChangedHelper.Generic.cs中:
using Windows.UI.Xaml;
using Windows.UI.Xaml.Data;
namespace SomeNamespace
{
public sealed class DataContextChangedHandler<T> where T : FrameworkElement, IDataContextChangedHandler<T>
{
private readonly DependencyProperty internalDataContextProperty =
DependencyProperty.Register(
"InternalDataContext",
typeof(object),
typeof(T),
new PropertyMetadata(null, DataContextChanged));
private static void DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
var control = sender as T;
if (control == null) { return; }
control.DataContextChanged(control, e);
}
public void Bind(T control)
{
control.SetBinding(this.internalDataContextProperty, new Binding());
}
}
}
在UserControlView.xaml.cs中:
using Windows.UI.Xaml;
namespace SomeNamespace
{
public sealed partial class UserControlView : IDataContextChangedHandler<UserControlView>
{
private readonly DataContextChangedHandler<UserControlView> handler = new DataContextChangedHandler<UserControlView>();
public UserControlView()
{
this.InitializeComponent();
this.handler.Bind(this);
}
public void DataContextChanged(UserControlView sender, DependencyPropertyChangedEventArgs e)
{
var viewModel = e.NewValue as UserControlViewModel;
if (viewModel == null) { return; }
viewModel.SomeEventRaised += (o, args) => VisualStateManager.GoToState(this, "TheOtherState", false);
}
}
}
希望能有所帮助。
关于mvvm - 在WinRT XAML UserControl中访问DataContext的位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15289708/