我有UserControlViewModel引发一个事件:

public event EventHandler<EventArgs> StuffDone;

UserControlViewModel内部创建并初始化MainPageViewModel对象:
this.userControlViewModel = new UserControlViewModel();
MainPageViewModelMainPage的 View 模型。

在MainPage.xaml中,我有以下代码将UserControlView UserControl放入MainPage并初始化其DataContext:
<views:UserControlView DataContext="{Binding userControlViewModel, Mode=OneWay}" IsHitTestVisible="False"></views:UserControlView>

到目前为止,一切正常。

现在,我想订阅StuffDone中的UserControlView事件。我想到的第一件事是在LoadedUserControlView事件处理程序内执行此操作;但是,此时的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/

10-11 13:36