IValueConverter 并绑定 DependencyObject

2024-01-25

我有一个ComboBox我需要做一个转换器SelectedItem。问题是IValueConverter需要绑定值,但也需要一个集合。配置了一个DependencyObject但它给了我一个错误消息

类型“System.Windows.Data.Binding”的对象无法转换为类型“System.Collections.ObjectModel.ObservableCollection`1[MyClass]”。

这是我的IValueConverter

public class MyConverter : DependencyObject, IValueConverter
{
    public static readonly DependencyProperty FoldersProperty = 
        DependencyProperty.Register(nameof(MyCollection), typeof(ObservableCollection<MyClass>), typeof(MyClassModelToMyClassID), new FrameworkPropertyMetadata(new ObservableCollection<MyClass>()));
    public ObservableCollection<MyClass> MyCollection
    {
        get { return GetValue(FoldersProperty) as ObservableCollection<MyClass>; }
        set { SetValue(FoldersProperty, value); }
    }
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        //Amazing Convert code that uses MyCollection and Value
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        //Amazing ConvertBack code that uses MyCollection and Value
    }
}

我是这样称呼它的:

<Page.Resources>
    <converter:MyConverter x:Key="Converter" MyCollection="{Binding DataCollection}" />
</Page.Resources>
....
<ComboBox 
    ItemsSource="{Binding DataCollection}"
    SelectedItem="{Binding Path=MyValue, Converter={StaticResource TaxCodeConverter}}" />

编辑:添加完整的 IValueConvert 减去 Convert 和 ConvertBack 代码


就像 BindingProxy 一样,它需要是可冻结的 https://learn.microsoft.com/en-us/dotnet/framework/wpf/advanced/freezable-objects-overview。另外,不要将新的可观察集合传递给您的元数据。这是一个引用类型,因此该转换器的所有实例都将使用相同的实际集合实例进行初始化。

如果您遇到其他问题,请告诉我,但我已经完成了此操作并且能够绑定到依赖项属性。

许多人认为更好的方法是多重绑定和多值转换器。我认为拥有具有描述性名称的强类型属性是有价值的。

public class MyConverter : Freezable, IValueConverter
{
    /* omitted: Convert() and ConvertBack() */

    public MyConverter()
    {
        //  Initialize here if you need to
        MyCollection = new ObservableCollection<MyClass>();
    }

    protected override Freezable CreateInstanceCore()
    {
        return new MyConverter();
    }

    public static readonly DependencyProperty MyCollectionProperty =
        DependencyProperty.Register(nameof(MyCollection), 
            typeof(ObservableCollection<MyClass>), typeof(MyConverter),
            new FrameworkPropertyMetadata(null));

    public ObservableCollection<MyClass> MyCollection
    {
        get { return GetValue(MyCollectionProperty) as ObservableCollection<MyClass>; }
        set { SetValue(MyCollectionProperty, value); }
    }
}

XAML 用法将与您在问题中所使用的一样:绑定依赖项属性,并且绑定将更新该实例的该属性MyConverter,前提是您的页面的 DataContext 有一个名为的适当类型的属性DataCollection.

<Page.Resources>
    <converter:MyConverter x:Key="Converter" MyCollection="{Binding DataCollection}" />
</Page.Resources>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IValueConverter 并绑定 DependencyObject 的相关文章

随机推荐