在WinRT XAML UserControl中访问DataContext的位置

时间:2013-03-08 08:32:47

标签: mvvm windows-runtime windows-store-apps winrt-xaml

我有UserControlViewModel引发了一个事件:

public event EventHandler<EventArgs> StuffDone;

UserControlViewModel

中创建并初始化MainPageViewModel的对象
this.userControlViewModel = new UserControlViewModel();

MainPageViewModelMainPage的视图模型。

在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并订阅其活动的正确位置在哪里?

提前致谢。

1 个答案:

答案 0 :(得分:1)

WinRT for Windows 8.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);
        }
    }
}

希望有所帮助。