如果ViewModel中的默认值为null,则将默认值绑定到可见性

时间:2014-11-04 14:31:46

标签: wpf xaml mvvm ivalueconverter

第一次加载一个窗口我希望折叠一个文本框,同时保持我的Viewmodel中属性(SomeProp)的绑定。

不幸的是,我无法做到这一点。

我的尝试:

尝试1: 我试图明确地在viewmodel的构造函数中将值设置为null,并且明确地调用Onpropertychanged。转换器未被触发。

尝试2: 在后面的代码中,我将默认可见性设置为visibility.Collapsed。这似乎有一个副作用,即Visibility不再绑定到SomeProp属性。

尝试3: 谷歌搜索后我发现了一些关于PriorityBinding的东西,但这似乎只适用于文本框的TEXT属性 Use a default value when binding cannot be evaluated because of a null value

提前谢谢你,

额外信息:

我有一个文本框,只有在我的ViewModel中的属性(SomeProp)具有值'Other'时才能看到它。 我成功地使用了转换器。这意味着每当我更改SomeProp的值时,文本框将变为可见/不可见,具体取决于SomeProp的值。 我使用了以下代码: WPF: Binding Visibility by string contents

有没有人知道如何在保持绑定到属性SomeProp的同时将te文本框可见性设置为折叠。

XAML

        <TextBox Name="txtbox" Visibility="{Binding SomeProp.Description, Converter={StaticResource StringOtherToVisibilityConverter}}" TextWrapping="Wrap" Height="150" MaxLength="2000"
                 Text="{Binding SomeProp2.Text, Mode=TwoWay}"
             ScrollViewer.VerticalScrollBarVisibility="Auto" AcceptsReturn="True">
        </TextBox>

转换器

class StringOtherToVisibilityConverter : System.Windows.Markup.MarkupExtension, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{

    if (value != null)
    {
        if (value.ToString() == "Other")
        {
            return Visibility.Visible;
        }
        else
        {
            return Visibility.Collapsed;
        }


    }
    else
    {
        return Visibility.Collapsed;
    }

}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    return null; //DependencyProperty.UnsetValue;
}

public override object ProvideValue(IServiceProvider serviceProvider)
{
    return this;
}


}

1 个答案:

答案 0 :(得分:4)

当源值为TargetNullValue={x:Static Visibility.Collapsed}时,设置null应该折叠绑定目标。

您还可以设置FallbackValue,这在绑定或转换失败时应用。如果NullReferenceExceptionX.Y,此类失败可能包括绑定到X时发生的null