【问题标题】:ValueConverter with properties [duplicate]具有属性的 ValueConverter [重复]
【发布时间】:2018-07-10 09:28:24
【问题描述】:

扩展以下问题:

Defining a Property in a IValueConverter class

我的问题是:

在 xaml 文件中,TrueValue 设置为单个值:

<CheckBox IsChecked="{Binding item, Converter={converter:ValueConverterWithProperties TrueValue=5}}"></CheckBox>

是否可以将 ValueConverter 中的属性绑定到某种列表? 绑定表达式会是什么样子?

【问题讨论】:

    标签: c# wpf binding valueconverter


    【解决方案1】:

    您可以在转换器类中声明一个依赖属性,将您的转换器声明为静态资源并将该属性绑定到视图模型属性。

    这将起作用:

    <Window x:Class="..."
            x:Name="_this" 
            ...>
    <Window.Resources>
        <local:DepPropConverter x:Key="Convert"
            MyList="{Binding DataContext.YourListInViewmodel, Source={x:Reference _this}}"/>
    </Window.Resources>
    <CheckBox IsChecked="{Binding item, Converter={StaticResource Converter}}"></CheckBox>
    

    转换器:

    public class DepPropConverter : DependencyObject, IValueConverter
    {
        public static readonly DependencyProperty MyListProperty =
            DependencyProperty.Register(
                nameof(MyList), typeof(IList), typeof(DepPropConverter));
    
        public IList MyList
        {
            get { return (IList)GetValue(MyListProperty); }
            set { SetValue(MyListProperty, value); }
        }
    
        public object Convert(
            object value, Type targetType, object parameter, CultureInfo culture)
        {
            //your logic here
            return value;
        }
    
        public object ConvertBack(
            object value, Type targetTypes, object parameter, CultureInfo culture)
        {
            //your logic here
            return value;
        }
    }
    

    【讨论】:

    • 没有 Source={x:Reference _this} 它不起作用,至少通过初始化!
    • 感谢 Rekshino,在通用的 UserControl/DataContext 环境中,这绝对可以正常工作。我确实看到了 x:Reference。我的环境是作为 ListBoxItem 一部分的自定义控件。因此,我无法设置 x:Reference。我改为设置 x:Type,但没有数据到达转换器。
    【解决方案2】:

    绑定到 IValueConverter 的参数或属性在 AFAIK 中不起作用,但您可以使用 IMultiValueConverter 并将附加值绑定到所需的属性:

    <MultiBinding Converter="{StaticResource MultiValueConverter}">
        <Binding Path="YourValue" />
        <Binding Path="YourParameter" />
    </MultiBinding>
    

    然后使用values[0]作为实际值,values[1]作为参数。

    【讨论】:

    • 嗯,谢谢,但这不是我的想法。如果 TrueValue-Property 不是 bool 类型,而是 List 或 IEnumerable 类型。是否可以绑定例如ListBox 的 ItemsSource 是否指向该属性?
    • @JoeM.Doe 它会以同样的方式工作。答案没有假设 Bindings 源属性的类型。 YourParameter 很可能是一个 IEnumerable。
    • 另一种可能是具有(可绑定)依赖属性的转换器,如下所述:stackoverflow.com/q/6856321/1136211
    猜你喜欢
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 2014-05-23
    • 2018-11-03
    • 1970-01-01
    相关资源
    最近更新 更多