我有UserControlViewModel
引发了一个事件:
public event EventHandler<EventArgs> StuffDone;
在UserControlViewModel
:
MainPageViewModel
的对象
this.userControlViewModel = new UserControlViewModel();
MainPageViewModel
是MainPage
的视图模型。
在MainPage.xaml中,我有以下代码将UserControlView
UserControl
放入MainPage
并初始化其DataContext
:
<views:UserControlView DataContext="{Binding userControlViewModel, Mode=OneWay}" IsHitTestVisible="False"></views:UserControlView>
到目前为止一切正常。
现在,我想在StuffDone
内订阅UserControlView
个活动。我遇到的第一件事就是在Loaded
的{{1}}事件处理程序中执行此操作;但是,此时的UserControlView
仍为DataContext
。扫描剩余的null
事件完全没有任何线索。
那么,获取UserControl
并订阅其活动的正确位置在哪里?
提前致谢。
答案 0 :(得分:1)
更新: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);
}
}
}
希望有所帮助。