2013-11-05 77 views
0

我在視圖上有10個按鈕,點擊時應該將ViewModel的適當屬性設置爲null(ViewModel是View的DataContext)。把它看作是重置行動。WPF按鈕:在xaml的Click事件中將屬性設置爲null

目前我所擁有的是ViewModel中的ICommand,每個按鈕的Command都綁定了,然後我將CommandParameter設置爲某個值,這將允許我區分ViewModel上哪些屬性需要更新。

爲了避免一堆的IFS,我想到做這樣的事情(不正確的語法)的:

<Button ...> 
    <i:Interaction.Triggers> 
    <i:EventTrigger EventName="Click"> 
     <Setter Property="PropertyA" Source="DataContext-ViewModel" Value="x:null" /> 
    </i:EventTrigger> 
    <i:Interaction.Triggers> 
</Button> 

這是可能實現的,以及如何

+0

而不是使用'if'爲什麼不使用'switch'。不知道你是否有可能要求。 – Sandesh

+0

@ aks81我沒有看到你回答的方式與我的問題有關嗎?你建議使用另一個控制語句,而我試圖避免使用它。 – Goran

+0

使用反射不是您的選擇嗎? – sthotakura

回答

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> 

如果你不喜歡思考的話,那麼你可以在你的視圖模型操作的字典:

_propertyResetters = new Dictionary<string, Action> 
{ 
    {"PropertyToSet",() => PropertyToSet = null} 
}; 

而且,在你的Command Execute方法中,你可以通過做_propertyResetters[(string)CommandParameter]();

希望這可以幫助或給你一些想法。

+0

嗨sthotakura,謝謝你的例子。我不知道你可以定義一個自定義的TriggerAction,所以這個信息很有價值。 – Goran

+0

這可以修改或添加到,以便您可以指定一個不同的控件的屬性來定位?像TargetName一樣? – jrandomuser

+0

@jrandomuser不知道我是否理解你的問題。你能再詳細一點嗎? – sthotakura

相關問題