2010-09-15 79 views
6

我有一個用戶控件(NameField)。在它內部,我有一個包含3個網格的StackPanel:StandardView,FluidView,OtherView。在代碼隱藏中,我有一個名爲ViewFormView(Enum)類型的DependencyProperty。該枚舉包含STANDARD,FLUID,OTHER。WPF觸發器綁定:將枚舉值綁定到可見性的最佳方式是什麼?

我想我必須創建一個轉換器,但我不確定這是否必要。我基本上想要使它唯一可見的網格是與枚舉值相匹配的網格......也就是說,如果View = NameFieldView.STANDARD那麼名爲StandardView的網格是可見的,而其他兩個不是。

另外,我不確定這是否應該是Grid.Resources/Style或Grid.Triggers的一部分?

+0

邊注:小心使用「視圖」作爲屬性名稱。這意味着現在使用Model-View-ViewModel模式的一個非常具體的事情,它是WPF世界中首選的工作方式。 – 2010-09-15 17:54:51

+0

我可以稱之爲「NameFieldVisualState」,我猜想和VisualState。但是,是的,我在那裏提醒小心:) – 2010-09-15 17:55:58

回答

7

就像很多WPF一樣,這取決於你的口味。這裏有幾個選擇。

您可以創建三個IValueConverter,將View屬性的值轉換爲Visibility(或將枚舉名稱用作ConverterParameter並創建一個轉換器)。

您可以創建三個名爲「StandardViewIsVisible」,「FluidViewIsVisible」和「OtherViewIsVisible」的新屬性,該屬性在View屬性更改時得到更新。這些屬性將是返回類型可見性。即使您沒有使用ViewModel,這絕對是更多的「MVVM」做事方式。

您可以使用DataTrigger根據View屬性的當前值設置合適的可見或可摺疊網格。

+1

我實際上使用了一個ValueConverter,並使用一個參數來決定檢查哪個視圖。 '流體'檢查查看是否設置爲流體。 '其他'檢查View是標準還是擴展。在該網格中,2個組合框項目在「擴展」中傳遞,以查看是否擴展了視圖。好極了! – 2010-09-15 20:16:28

1

我會創建一個轉換器。如果您在遇到像這樣的適當綁定問題時添加了轉換器,您將慢慢爲應用程序構建一個轉換器庫,從而使您在將來更容易。我只能說這有點像NameFieldViewToVisibilityConverter - 它應該有兩個方法:

public Object Convert(Object value, Type TargetType, Object param, CultureInfo Culture); 
public Object ConvertBack(Object value, Type TargetType, Object param, CultureInfo Culture); 

轉換將有NameFieldView PARAM並返回一個可見值。 ConvertBack將具有可見性參數並返回NameFieldView值。

的綁定是這樣的:

<Grid Name="StandardView" Visibility="{Binding View, Converter={StaticResource NameFieldViewToVisibilityConverter}" /> 
10

我用這個數據觸發。它看起來像這樣;

<Style TargetType="DockPanel" x:Key="ViewStyle1"> 
    <Setter Property="Visibility" Value="Collapsed"/> 
    <Style.Triggers> 
    <DataTrigger Binding="{Binding ViewStyle}" Value="ViewStyle1"> 
     <Setter Property="Visibility" Value="Visible"/> 
    </DataTrigger> 
    </Style.Triggers> 
</Style> 

然後,我創建一個DockPanel爲每個視圖樣式,並且每當ViewStyle屬性的變化,適當的視圖顯示。

相關問題