2010-01-23 64 views
14

好綁定可見性,所以這裏是我的XAML:WPF:由字符串內容

<TextBlock Text="{Binding Path=InstanceName}"></TextBlock> 

如果InstanceName爲空或空字符串,我想Visibility="Collapsed"。否則,我想Visibility="Visible"。我會怎麼做?

回答

40

你可以使用一個ValueConverter:

<TextBlock 
    Visibility="{Binding InstanceName, Converter={local:StringNullOrEmptyToVisibilityConverter}}" 
    Text="{Binding InstanceName}"/> 

與下列代碼隱藏:

public class StringNullOrEmptyToVisibilityConverter : System.Windows.Markup.MarkupExtension, IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return string.IsNullOrEmpty(value as string) 
      ? Visibility.Collapsed : Visibility.Visible; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    {    
     return this; 
    } 
} 
+0

我可以看到工作,但這將變得非常繁瑣快速。我不禁想到有一個更好的方法。 – 2010-01-23 17:48:13

+6

你認爲這將是一個乏味的部分?你認爲分別設置可視性和文本可能會變得乏味嗎?或者你認爲一般的價值轉換者是如此嗎? 我會改變的一件事是綁定可見性屬性與relativesource自我與路徑=名稱,以便您不重複「InstanceName」! 除此之外,我不明白這可能會變得單調乏味 (您可以隨時編寫自己的MarkupExtensions,甚至可以做一個可以做到這一點的行爲,但我認爲它已經超過了頂部,並且valueconverter將會是正確的事) – 2010-01-23 18:20:55

0

通過將在您的視圖模型可以綁定的可見性屬性額外的屬性:

public class ViewModel 
{ 
    public string InstanceName {...} 
    public string Visibility InstanceVisibility 
    { 
     get 
     { 
      return String.IsNullOrEmpty(InstanceName) ? Visibility.Collapsed : Visibility.Visible; 
     } 
} 
+1

我不喜歡那樣。該模型需要被多個視圖共享,但只有這個行爲是必需的。 – 2010-01-23 17:28:22

+1

Imo視圖和視圖模型之間存在一對一的關係。如果你有共享一些常見功能的視圖,你可以提取常見的部分,也許把它們放在一個普通的viewmodel超類中。 – 2010-01-23 22:06:56

+0

這聽起來不對。我對'ViewModels'不熟悉,但對於經典的MVC,多個視圖可以綁定到同一個模型實例。通過這種方式,您可以在一個窗口中進行編輯,並在另一個窗口中實時更新。 – 2010-01-25 01:44:03

3

如果你是一個(數據並行)模板中可以使用觸發器了點。

否則,MVVM-PatternValueConverter將幫助您。

+0

+1值轉換器更正確。 – 2010-01-23 13:43:37

+0

觸發器和ValueConverter都不易測試。 – 2010-01-23 16:42:20

+2

沒有一個是「可測試的」,因爲唯一真正的測試是目測檢查結果以獲得所需的效果。 – 2010-01-23 17:46:14

0
<TextBlock Text="{Binding Path=InstanceName},FallbackValue={x:Null}"></TextBlock> 

然後添加一個DataTrigger來檢查值爲空,並使用Setter更改可視性。 這是iam使用的簡單方法。

+0

有趣。但是,這將無法與InstanceName == String.Empty ... – 2010-01-23 11:54:19

0

好了,這是密切與PyBinding:

<TextBlock Text="{Binding Path=InstanceName}" Visibility="{p:PyBinding BooleanToVisibility(IsNotNull($[.InstanceName]))}" ></TextBlock> 

我需要更換IsNotNull這意味着IsNotNullOrEmpty,但我越來越近了。