2009-09-12 108 views
8

我有一個嘗試實現MVVM模式和Prism 2的WPF應用程序。我有一個Usercontrol訂閱了從另一個Usercontrol觸發的事件。我想切換訂閱控件中少量子元素的可見性。事件被正確觸發,即使我能成功地將數據綁定到某些元素。如何將Visibility或任何樣式屬性與ViewModel綁定並動態更改。如何從ViewModel更改WPF控件的可見性

回答

23

您可以在ViewModel中擁有布爾屬性並將該屬性綁定到控件的Visibility屬性。由於您將asigning一個布爾值和可見性屬性期待一個能見度枚舉值,你將不得不使用BooleanToVisibilityConverter轉換器進行轉換,

<Style.Resources> 
    <BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" /> 
</Style.Resources> 

<Image Visibility="{Binding Path=ShowImage, 
        Converter={StaticResource booleanToVisibilityConverter}}"/> 

希望這有助於。

埃塞基耶爾Jadib

+0

不知何故,這並沒有爲我工作。我在Usercontrol.Resources部分聲明瞭轉換器,並使用了綁定,如您在註釋中所述。 – Raj 2009-09-13 03:04:45

+1

對不起我的錯誤。這工作。謝謝。 – Raj 2009-09-13 04:19:51

8

雖然添加布爾屬性和使用值轉換器的作品,我會建議加式能見度的屬性您視圖模型,例如

public Visibility ImageVisibility 
{ 
    get { return shouldShowImage ? Visibility.Visible : Visibility.Collapsed } 
} 

這種方法的優點是你不需要寫一個轉換器,你想在一個可視化的方式來表達(例如,對於庫存水平,輪流標籤紅色,當它低於10的每個屬性,你可以使用一次轉換器,或者只是從虛擬機中暴露一個StockLabelBrush屬性)

+0

雖然這個答案很高雅,但它有一個問題。如果程序更改'shouldShowImage',則該更改不會發送到視圖。 – James 2014-03-19 14:35:37

+1

這是真的,但有幾種方法可以解決問題。你可以從'shouldShowImage'處理'PropertyChanged'事件並引發一個新的'PropertyChanged'事件,或者只允許通過引發兩個屬性的事件的包裝器屬性來訪問'shouldShowImage'。 – Darren 2014-03-19 16:52:33

1

我知道這是一個老問題,但對於遇到此問題並找到答案的人有一個簡單的解決方案。

在您的視圖模型,創建一個 「可見性」 屬性,像這樣:

public Visibility ShowModifyButtons 
    { 
     get { return (Visibility)GetValue(ShowModifyButtonsProperty); } 
     set { SetValue(ShowModifyButtonsProperty, value); } 
    } 
public static readonly DependencyProperty ShowModifyButtonsProperty = 
     DependencyProperty.Register("ShowModifyButtons", typeof(Visibility), typeof(FileMatchViewModel), 
     new UIPropertyMetadata(Visibility.Collapsed)); 

在XAML中,綁定到它,像這樣:

<Button Focusable="False" Content="Save" Width="100" Margin="10" Visibility="{Binding ShowModifyButtons}"/> 

現在,從您的視圖模型,你可根據需要將ShowModifyButtons設置爲Visibility.CollapsedVisibility.Visible