我已成功使用 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 事件(或使用其他方法),我非常想知道。
答案 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名称,这是个好消息。