2010-11-18 49 views
2

我試圖找出這一個問題時遇到了一點問題......在WPF中使用MVVM模式,我們的C#模型發生事件說事情發生了。我希望能夠在ViewModel中處理該事件,然後啓動故事板或更改當前Xaml頁面上隱藏面板的可見性。這必須在沒有代碼隱藏的情況下處理。WPF:如何處理模型中的事件以動態更新MVVM中的xaml

我可以在我的ViewModel中同步事件,更新屬性以說明該事件的名稱是什麼,並且甚至會觸發NotifyPropertyChanged,但是如何獲取該事件以啓動故事板或映射到布爾真/我的網格的可見性屬性爲false?我綁定到hs作爲不同網格的事件名稱的屬性可能會基於不同的事件顯示,所以我需要一種將其映射到布爾值的方法。然而,理想的解決方案是啓動故事板。我看過DataTriggers,但它們似乎都鏈接到樣式,而不是實際頁面。

任何想法,我可以如何實現這一目標?

謝謝!

回答

0

將Xaml中網格的Visibility屬性綁定到ViewModel上的布爾屬性。

<Grid Visibility="{Binding Path=VisiblePropertyOnViewModel}"> 

現在,您可以在ViewModel中執行任何操作並設置屬性。只要它做INotifyPropertyChanged或是一個DependencyProperty,它就可以工作。

我不得不做更多的挖掘來弄清楚如何啓動一個故事板,但我毫不懷疑它幾乎一樣容易。我相信,故事板可以被PropertyTriggers踢開。我會離開這個讓你開始。

+0

感謝您的答案戴夫 - 真的很感激它!問題是這個屬性不是一個布爾值。這是一個字符串。基本上有一大堆事件可能發生(實際上有好幾百個!),所以我想更多的是鬆散地輸入這些信息,讓Xaml做一些事情: - 所以表達式的計算結果爲true,並將可見性設置爲true ... – Slippy 2010-11-18 18:09:41

+0

可見性有3個可能的值,您需要一個轉換器將其綁定到布爾值並選擇true/false手段爲摺疊/隱藏/可見。 – Matthieu 2010-11-18 18:11:55

+0

乾杯Matthieu - 我希望避免一個轉換器,因爲我有一個無盡的無限的事件列表。如果你想做任何表情評估,我想轉換器必須被使用。 – Slippy 2010-11-18 18:17:59

1

我已經在過去使用此揭開序幕故事板代碼隱藏

Storyboard animation = (Storyboard)this.FindResource("ShowPanelStoryboard"); 
animation.Begin(); 

此代碼去查看後面,而不是在視圖模型。就個人而言,我不介意我的View背後的一些代碼,只要它與View相關即可。在我使用這個項目的過程中,我添加了一個監聽器到VisibilityChanged事件中,當它變成Visible時,我跑了故事板。

至於顯示您的彈出窗口,有幾種方法。我最喜歡的之一就是將一個IsPopupShown屬性添加到ViewModel,將我的面板的可見性綁定到它,並在任何時候顯示彈出窗口時將其設置爲true。 ViewModel然後處理觸發顯示或不顯示彈出窗口的事件。

Dave White建議的替代方法是使用轉換器。如果你的值不總是真/假,那麼你可以創建一個轉換器來檢查綁定值是否等於ConverterParameter,並返回一個Visibility值。

+0

謝謝蕾切爾 - 我在這裏唯一的問題是我根本沒有代碼。我正在純粹使用鬆散Xaml :(我也許會看看Convertor的路線,看看它是否可以工作。感謝您的迴應。真的很感謝! – Slippy 2010-11-22 11:26:45

1

從您的評論,在我看來,你可能想要做的就是在你的視圖模型中顯示Eventobject類型的屬性。當視圖模型接收到事件時,它將Event設置爲適合於該事件的類型的對象。在XAML中,你有這樣的:

<ContentControl Content="{Binding Event}"/> 

,並在資源字典定義爲DataTemplate要顯示的每個特定類型的事件。如果Event爲空,則不顯示任何內容。如果Event包含您爲DataTemplate定義的對象,則會使用該模板顯示該對象。

是的,你需要爲每種類型的事件創建一個類(如果你還沒有的話)。

另一種方式是實現窮人的模板選擇:

<TextBlock Text="This is displayed if Foo contains 'BAR'"> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Property="Foo" Value="BAR"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 
<TextBlock Text="This is displayed if Foo contains 'BAZ'"> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Property="Foo" Value="BAZ"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 

這是一種愚蠢冗長,但它是一個簡單的方法來處理大量的互斥顯示選項。

+0

感謝Robert - 這聽起來完全可行。通過例子來看看是否有竅門。謝謝你的答案! – Slippy 2010-11-22 11:25:00

相關問題