5

私はUserControlViewModelイベントを発生させるものを持っています:

public event EventHandler<EventArgs> StuffDone;

のオブジェクトUserControlViewModelが作成され、内部で初期化されますMainPageViewModel:

this.userControlViewModel = new UserControlViewModel();

MainPageViewModelのビューモデルですMainPage

MainPage.xaml には、次のコードを配置UserControlView UserControlMainPageて初期化しますDataContext

<views:UserControlView DataContext="{Binding userControlViewModel, Mode=OneWay}" IsHitTestVisible="False"></views:UserControlView>

これまでのところ、すべて正常に動作しています。

StuffDoneここで、内のイベントをサブスクライブしたいと思いUserControlViewます。私が最初に思いついたのは、Loadedのイベントハンドラー内でそれを行うことUserControlViewです。ただし、DataContextその時点ではまだnullです。残りのUserControlイベントをスキャンしても、まったく手掛かりがありませんでした。

DataContextでは、そのイベントを取得してサブスクライブするのに適切な場所はどこでしょうか?

前もって感謝します。

4

1 に答える 1

1

UPDATE : DataContextChangedイベントは、WinRT for Windows 8.1 でサポートされています。以下は、WinRT for Windows 8 または をサポートしていないプラットフォームに対してコーディングする場合にのみ使用してくださいDataContextChanged

それを行う簡単な方法はないようで、ウィルがコメントで提案した回避策が最も簡単な方法です。

以下は、私にとって有効な回避策の私のバージョンです。

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);
        }
    }
}

それが役立つことを願っています。

于 2013-03-15T08:47:15.187 に答える