如果使用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>
如果你不喜歡思考的話,那麼你可以在你的視圖模型操作的字典:
_propertyResetters = new Dictionary<string, Action>
{
{"PropertyToSet",() => PropertyToSet = null}
};
而且,在你的Command Execute方法中,你可以通過做_propertyResetters[(string)CommandParameter]();
希望這可以幫助或給你一些想法。
而不是使用'if'爲什麼不使用'switch'。不知道你是否有可能要求。 – Sandesh
@ aks81我沒有看到你回答的方式與我的問題有關嗎?你建議使用另一個控制語句,而我試圖避免使用它。 – Goran
使用反射不是您的選擇嗎? – sthotakura