好綁定可見性,所以這裏是我的XAML:WPF:由字符串內容
<TextBlock Text="{Binding Path=InstanceName}"></TextBlock>
如果InstanceName
爲空或空字符串,我想Visibility="Collapsed"
。否則,我想Visibility="Visible"
。我會怎麼做?
好綁定可見性,所以這裏是我的XAML:WPF:由字符串內容
<TextBlock Text="{Binding Path=InstanceName}"></TextBlock>
如果InstanceName
爲空或空字符串,我想Visibility="Collapsed"
。否則,我想Visibility="Visible"
。我會怎麼做?
你可以使用一個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;
}
}
通過將在您的視圖模型可以綁定的可見性屬性額外的屬性:
public class ViewModel
{
public string InstanceName {...}
public string Visibility InstanceVisibility
{
get
{
return String.IsNullOrEmpty(InstanceName) ? Visibility.Collapsed : Visibility.Visible;
}
}
我不喜歡那樣。該模型需要被多個視圖共享,但只有這個行爲是必需的。 – 2010-01-23 17:28:22
Imo視圖和視圖模型之間存在一對一的關係。如果你有共享一些常見功能的視圖,你可以提取常見的部分,也許把它們放在一個普通的viewmodel超類中。 – 2010-01-23 22:06:56
這聽起來不對。我對'ViewModels'不熟悉,但對於經典的MVC,多個視圖可以綁定到同一個模型實例。通過這種方式,您可以在一個窗口中進行編輯,並在另一個窗口中實時更新。 – 2010-01-25 01:44:03
如果你是一個(數據並行)模板中可以使用觸發器了點。
否則,MVVM-Pattern或ValueConverter將幫助您。
+1值轉換器更正確。 – 2010-01-23 13:43:37
觸發器和ValueConverter都不易測試。 – 2010-01-23 16:42:20
沒有一個是「可測試的」,因爲唯一真正的測試是目測檢查結果以獲得所需的效果。 – 2010-01-23 17:46:14
<TextBlock Text="{Binding Path=InstanceName},FallbackValue={x:Null}"></TextBlock>
然後添加一個DataTrigger來檢查值爲空,並使用Setter更改可視性。 這是iam使用的簡單方法。
有趣。但是,這將無法與InstanceName == String.Empty ... – 2010-01-23 11:54:19
好了,這是密切與PyBinding:
<TextBlock Text="{Binding Path=InstanceName}" Visibility="{p:PyBinding BooleanToVisibility(IsNotNull($[.InstanceName]))}" ></TextBlock>
我需要更換IsNotNull這意味着IsNotNullOrEmpty,但我越來越近了。
我可以看到工作,但這將變得非常繁瑣快速。我不禁想到有一個更好的方法。 – 2010-01-23 17:48:13
你認爲這將是一個乏味的部分?你認爲分別設置可視性和文本可能會變得乏味嗎?或者你認爲一般的價值轉換者是如此嗎? 我會改變的一件事是綁定可見性屬性與relativesource自我與路徑=名稱,以便您不重複「InstanceName」! 除此之外,我不明白這可能會變得單調乏味 (您可以隨時編寫自己的MarkupExtensions,甚至可以做一個可以做到這一點的行爲,但我認爲它已經超過了頂部,並且valueconverter將會是正確的事) – 2010-01-23 18:20:55