VisualStateGroup的ViewModel方法的事件

时间:2015-11-05 15:52:33

标签: c# xaml mvvm windows-10 uwp

我已成功使用 EventTriggerBehavior CallMethodAction 将事件转换为方法(在ViewModel中使用),如以下示例所示(此处选择了一个页面已加载< / strong>事件说明)。

<i:Interaction.Behaviors> <core:EventTriggerBehavior EventName="CurrentStateChanged"> <core:CallMethodAction MethodName="CurrentVisualStateChanged" TargetObject="{Binding Mode=OneWay}"/> </core:EventTriggerBehavior> </i:Interaction.Behaviors>

但是,对于 VisualStateGroup CurrentStateChanged 事件没有成功,如下所示(是的,嵌套在{{1}}块中作为 CurrentStateChanged 事件属于 VisualStateGroup ):

{{1}}

我怀疑VisualStateGroup(或VisualStateManager)和 CurrentStateChanged 事件可能存在问题。我这样说是因为,我可以通过这种方法与其他活动合作。我检查并重新检查了 CallMethodAction 方法签名(事件参数传递格式),但没有机会。

如果您设法按上述方式触发 CurrentStateChanged 事件(或使用其他方法),我非常想知道。

2 个答案:

答案 0 :(得分:1)

  

但是,对于VisualStateGroup的CurrentStateChanged事件没有成功,如下所示

是的,EventTriggerBehavior不适用于VisualStateGroup.CurrentStateChanged事件。

可行的方法是创建专门针对此方案的自定义行为,请参阅 Marco Minerva撰写的this blog

此行为可以帮助我们监视当前的VisualStatus,在自定义属性的Set方法(ViewModelState类型)中,根据需要调用方法:

public class MainViewModel : ViewModelBase
{
        public enum ViewModelState
        {
            Default,
            Details
        }

        private ViewModelState currentState;
        public ViewModelState CurrentState
        {
            get { return currentState; }
            set
            {
                this.Set(ref currentState, value);
                OnCurrentStateChanged(value);
            }
        }

        public RelayCommand GotoDetailsStateCommand { get; set; }
        public RelayCommand GotoDefaultStateCommand { get; set; }

        public MainViewModel()
        {
            GotoDetailsStateCommand = new RelayCommand(() =>
            {
                CurrentState = ViewModelState.Details;
            });

            GotoDefaultStateCommand = new RelayCommand(() =>
            {
                CurrentState = ViewModelState.Default;
            });
        }

        public void OnCurrentStateChanged(ViewModelState e)
        {
            Debug.WriteLine("CurrentStateChanged: " + e.ToString());
        }
}

请在Github

上查看我已完成的示例

答案 1 :(得分:0)

可能是由于最新的SDK,我设法让它使用动态绑定(对于事件到方法模式),如下所示。

在XAML中将CurrentStateChanged事件绑定为:

<VisualStateGroup CurrentStateChanged="{x:Bind ViewModel.CurrentVisualStateChanged}">

在ViewModel中,将CurrentStateChanged()方法与CurrentStateChanged事件签名一起提供为:

public void CurrentVisualStateChanged(object sender, VisualStateChangedEventArgs e)
{
    var stateName = e?.NewState.Name;  // get VisualState name from View
    ...
    // more code to make use of the VisualState
}

以上这段时间对我来说不起作用,现在我在 VS2015 Update 2 之后尝试了,我怀疑是最新的SDK得到了增强?无论如何,现在可以通过动态绑定在视图模型中获取VisualState名称,这是个好消息。