首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IValueConverter与绑定DependencyObject

IValueConverter与绑定DependencyObject
EN

Stack Overflow用户
提问于 2019-10-21 19:50:59
回答 1查看 221关注 0票数 2

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

不能将“System.Windows.Data.Binding”类型的对象转换为System.Windows.Data.Binding类型

这是我的IValueConverter

代码语言:javascript
复制
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
    }
}

我是这样称呼它的:

代码语言:javascript
复制
<Page.Resources>
    <converter:MyConverter x:Key="Converter" MyCollection="{Binding DataCollection}" />
</Page.Resources>
....
<ComboBox 
    ItemsSource="{Binding DataCollection}"
    SelectedItem="{Binding Path=MyValue, Converter={StaticResource TaxCodeConverter}}" />

编辑:添加完整的IValueConvert,减去转换代码和ConvertBack代码

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-21 19:54:58

就像BindingProxy一样,它需要是可冻结的。另外,不要将新的可观察集合传递给元数据。这是一个引用类型,因此这个转换器的所有实例都将使用相同的实际集合实例进行初始化。

如果遇到其他问题,请告诉我,但是我已经这样做了,并且能够绑定到依赖项属性。

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

代码语言:javascript
复制
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的适当类型属性。

代码语言:javascript
复制
<Page.Resources>
    <converter:MyConverter x:Key="Converter" MyCollection="{Binding DataCollection}" />
</Page.Resources>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58493209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档