2012-01-20 26 views
0

我正在尋找一個如何使用MVVM light實現數據表單的屬性IsEnabledChanged的示例,我設置了觸發器但不確定實現。所以,這裏是版本後面的代碼:使用MVVM光我這樣做在XAML如何使用MVVM實現Silverlight數據表單的IsEnabledChanged

void DataForm_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     if (!IsEnabled) 
     { 
      VisualStateManager.GoToState(DataForm, "Disabled", true); 
     } 
     else 
     { 
      VisualStateManager.GoToState(DataForm, "Normal", true); 
     } 
    } 

DataForm.IsEnabledChanged += new DependencyPropertyChangedEventHandler(DataForm_IsEnabledChanged); 

<i:EventTrigger EventName="IsEnabledChanged"> 
        <cmdextras:EventToCommand Command="{Binding IsEnabledChangedCommand}" CommandParameter="{Binding .}" /> 
       </i:EventTrigger> 

現在需要弄清楚如何將後面的代碼轉換爲使用relaycommand。

+0

能你向我們展示你到目前爲止的代碼? – slugster

+0

我在我的問題中添加了代碼。 – user282807

+0

你的代碼隱藏有什麼問題?如果它工作 - 爲什麼要改變它?您正在執行的代碼與您的視圖緊密耦合。不需要涉及視圖模型。 – ColinE

回答

1

我創建了一個與數據表單的EditStarted事件類似的行爲。

public class EditableDataFormBehavior : Behavior<RadDataForm> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 

     AssociatedObject.Loaded += AssociatedObject_Loaded; 
    } 

    void AssociatedObject_Loaded(object sender, RoutedEventArgs e) 
    { 
     AssociatedObject.CurrentItemChanged += AssociatedObject_CurrentItemChanged; 
    } 

    void AssociatedObject_CurrentItemChanged(object sender, EventArgs e) 
    { 
     var editableObject = AssociatedObject.CurrentItem as INotifyEditableObject; 
     if (editableObject != null) 
     { 
      editableObject.EditStarted += Object_EditStarted; 
     } 
    } 

    void Object_EditStarted(object sender, EventArgs e) 
    { 
     AssociatedObject.BeginEdit(); 
    } 

    protected override void OnDetaching() 
    { 
     // detach the event handler 
     AssociatedObject.Loaded -= AssociatedObject_Loaded; 
     AssociatedObject.CurrentItemChanged -= AssociatedObject_CurrentItemChanged; 

     var editableObject = AssociatedObject.DataContext as INotifyEditableObject; 
     if(editableObject!=null) 
      editableObject.EditStarted -= Object_EditStarted; 
     base.OnDetaching(); 
    } 


} 

您只需要通過附加到IsEnabledChanged事件來修改一下。您正嘗試實現僅查看行爲,而視圖模型應該對此一無所知。這樣做的主要好處是它比代碼隱藏更具可重用性。

在事件處理程序,你會增加你的代碼:

if (!IsEnabled) 
    { 
     VisualStateManager.GoToState(DataForm, "Disabled", true); 
    } 
    else 
    { 
     VisualStateManager.GoToState(DataForm, "Normal", true); 
    } 

附加行爲,數據格式(我被做了Telerik的一個,但應該是可行的SDK)

<i:Interaction.Behaviors> 
       <utilities:EditableDataFormBehavior/> 
</i:Interaction.Behaviors> 
+0

嗨,我是goona給這個行爲一個鏡頭,讓你知道它是如何工作的。 – user282807

+0

非常感謝SalieHendricks!很棒。 – user282807

1

EventTrigger僅販售routed eventssee documentation)。在處理dependency property changed event時,EventTrigger根本無法識別。

所以從我看到的使用後面的代碼是實現所需功能的唯一方法。此外,您正在處理屬於該視圖的功能,並且綁定到您正在使用的控件(在這種情況下爲DataForm)。因此,將該依賴關係拉入視圖模型會是相反的,因爲視圖模型應該獨立於任何給定的視圖實現 - 即目標是設計視圖模型,以便它可以獨立於視圖和其中的控制。

+0

感謝您的解釋。我會先嚐試一下SalieHendrix提供的行爲。 – user282807

相關問題