我在视图上有10个按钮,单击它们时应将ViewModel上的足够属性设置为null(ViewModel是View的DataContext)。把它想象成重置动作。
目前我所拥有的是ViewModel中的ICommand,每个按钮的命令都绑定,然后我将CommandParameter设置为某个值,这样我就可以区分ViewModel上需要更新的属性。
为了避免大量的If,我正在考虑做这样的事情(语法不正确):
<Button ...>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<Setter Property="PropertyA" Source="DataContext-ViewModel" Value="x:null" />
</i:EventTrigger>
<i:Interaction.Triggers>
</Button>
这有可能实现,以及如何实现?
答案 0 :(得分:0)
如果您使用Reflection
选项,则可以使用Reflection
在ViewModel中设置属性。
你的命令执行方法将会是这样的:
this.GetType().GetProperty((string)CommandParameter).SetValue(this, null, new object[] {});
但是,如果您更喜欢问题中提到的XAML路线,那么可以创建TriggerAction
并在EventTrigger
中使用它。以下是我的尝试:
public sealed class SetProperty : TriggerAction<FrameworkElement>
{
public static readonly DependencyProperty SourceProperty =
DependencyProperty.Register("Source", typeof (object), typeof (SetProperty), new PropertyMetadata(default(object)));
/// <summary>
/// Source is DataContext
/// </summary>
public object Source
{
get { return (object) GetValue(SourceProperty); }
set { SetValue(SourceProperty, value); }
}
public static readonly DependencyProperty PropertyNameProperty =
DependencyProperty.Register("PropertyName", typeof (string), typeof (SetProperty), new PropertyMetadata(default(string)));
/// <summary>
/// Name of the Property
/// </summary>
public string PropertyName
{
get { return (string) GetValue(PropertyNameProperty); }
set { SetValue(PropertyNameProperty, value); }
}
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof (object), typeof (SetProperty), new PropertyMetadata(default(object)));
/// <summary>
/// Value to Set
/// </summary>
public object Value
{
get { return (object) GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
protected override void Invoke(object parameter)
{
if (Source == null) return;
if (string.IsNullOrEmpty(PropertyName)) return;
Source.GetType().GetProperty(PropertyName).SetValue(Source, Value, new object[] {});
}
}
和XAML:
<Button Content="Reset">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<local:SetProperty Source="{Binding}" PropertyName="PropertyToSet" Value="{x:Null}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
如果你根本不喜欢Reflection,那么你可以在Viewmodel中有一个动作词典:
_propertyResetters = new Dictionary<string, Action>
{
{"PropertyToSet", () => PropertyToSet = null}
};
并且,在您的Command Execute方法中,您可以通过执行_propertyResetters[(string)CommandParameter]();
希望这有助于或给你一些想法。