Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF条件绑定_Wpf_Data Binding_Conditional - Fatal编程技术网

WPF条件绑定

WPF条件绑定,wpf,data-binding,conditional,Wpf,Data Binding,Conditional,我有一个树视图和一些其他控件,比如文本框和组合框。 文本框绑定到树视图中的选定项,如下所示: Text="{Binding SelectedItem.Name, ElementName=groupTreeView}" 如果我的TreeView中的所有元素都有Name属性,那么这就很好了 我想知道是否有一种方法可以进行某种条件绑定,即: if SelectedItem is MyTreeType then bind else disable the element 有可能这样做

我有一个树视图和一些其他控件,比如文本框和组合框。 文本框绑定到树视图中的选定项,如下所示:

Text="{Binding SelectedItem.Name, ElementName=groupTreeView}"
如果我的TreeView中的所有元素都有Name属性,那么这就很好了

我想知道是否有一种方法可以进行某种条件绑定,即:

if SelectedItem is MyTreeType
    then bind
else
    disable the element
有可能这样做吗? 现在我刚刚抛出了绑定错误,这看起来有点脏。我的TreeView是数据绑定的,其中有两个不同类型的类,这就是我寻找某种条件绑定的原因

谢谢,
Raul

看一看或

看一看或

这就是为什么在视图类中重写ToString总是一个好主意。这样做,您就可以将文本绑定到SelectedItem。

这就是为什么在视图类中重写ToString总是一个好主意。这样做,您就可以将文本绑定到SelectedItem。

我最终创建了一个CastingConverter,并将该类型作为参数发送进来

public class CastingConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return null;

        if (parameter == null)
            throw new ArgumentNullException("parameter");

        var type = parameter as Type;

        if (type == null)
            throw new ArgumentException("parameter must be a type");

        var itemType = value.GetType();

        if (type.IsAssignableFrom(itemType))
            return value;

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}
那么我就用下面的话来说明

DataContext="{Binding SelectedItem, ElementName=groupTreeView, Converter={StaticResource CastingConverter}, ConverterParameter={x:Type vm:GroupViewModel}}"

我最终创建了一个CastingConverter,我将类型作为参数发送进来

public class CastingConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return null;

        if (parameter == null)
            throw new ArgumentNullException("parameter");

        var type = parameter as Type;

        if (type == null)
            throw new ArgumentException("parameter must be a type");

        var itemType = value.GetType();

        if (type.IsAssignableFrom(itemType))
            return value;

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}
那么我就用下面的话来说明

DataContext="{Binding SelectedItem, ElementName=groupTreeView, Converter={StaticResource CastingConverter}, ConverterParameter={x:Type vm:GroupViewModel}}"
看看使用MVVM设计模式,您的绑定代码很简单,逻辑在一个可测试类中。这是更多的工作开始,但往往导致较少的问题在长期

下面是一个非常好的视频,您应该看一下:

看看使用MVVM设计模式,那么您的绑定代码很简单,逻辑在一个可测试类中。这是更多的工作开始,但往往导致较少的问题在长期


这是一个非常好的视频,您应该看一看:

确保它适用于显示文本,但不支持更新Name属性,如果对象上有很多属性,它也不起作用。确保它适用于显示文本,但不支持更新Name属性,如果对象上有很多属性,它也不起作用。