WPF数据绑定 - 的&QUOT例;自定义类型描述符" [英] WPF Data Binding - Example of "Custom Type Descriptor"

查看:162
本文介绍了WPF数据绑定 - 的&QUOT例;自定义类型描述符"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我看到几个人说,WPF可以使用自定义类型描述符的变更通知。

I see several people saying that WPF can use "Custom Type Descriptors" for "Change notification".

我知道该怎么做变更通知的方法是:

The ways I know how to do Change Notification are:

object.GetBindingExpression(Bound.property).UpdateTarget();

还是有我的目标实施 INotifiyPropertyChanged

我看到的评论说,自定义类型描述符也可以工作,但是没有人给它如何工作的一个很好的例子。我现在要求这个例子(IE WPF数据的一个很好的例子绑定,并通过自定义类型描述符更新。)

I see comments saying that Custom Type Descriptors will work too, but no one gives a good example on how it works. I am now asking for that example (IE a good example of WPF Data Binding and updating via Custom Type Descriptors.)

推荐答案

下面是为您pretty简单的例子。

Here's a pretty simple example for you.

Window1.xaml

<Window x:Class="CTDExample.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <TextBlock>Name:</TextBlock>
        <TextBox Grid.Column="1" Text="{Binding Name}"/>

        <TextBlock Grid.Row="1">Age:</TextBlock>
        <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Age}"/>

        <TextBlock Grid.Row="2" Grid.ColumnSpan="2">
            <TextBlock.Text>
                <MultiBinding StringFormat="{}{0} is {1} years old.">
                    <Binding Path="Name"/>
                    <Binding Path="Age"/>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </Grid>
</Window>

Window1.xaml.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows;

namespace CTDExample
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            var ctd = new CTD();
            ctd.AddProperty("Name");
            ctd.AddProperty("Age");
            DataContext = ctd;
        }
    }

    public class CTD : CustomTypeDescriptor
    {
        private static readonly ICollection<PropertyDescriptor> _propertyDescriptors = new List<PropertyDescriptor>();

        public void AddProperty(string name)
        {
            _propertyDescriptors.Add(new MyPropertyDescriptor(name));
        }

        public override PropertyDescriptorCollection GetProperties()
        {
            return new PropertyDescriptorCollection(_propertyDescriptors.ToArray());
        }

        public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
        {
            return GetProperties();
        }

        public override EventDescriptorCollection GetEvents()
        {
            return null;
        }

        public override EventDescriptorCollection GetEvents(Attribute[] attributes)
        {
            return null;
        }
    }

    public class MyPropertyDescriptor : PropertyDescriptor
    {
        private readonly IDictionary<object, object> _values;

        public MyPropertyDescriptor(string name)
            : base(name, null)
        {
            _values = new Dictionary<object, object>();
        }

        public override bool CanResetValue(object component)
        {
            throw new NotImplementedException();
        }

        public override Type ComponentType
        {
            get { throw new NotImplementedException(); }
        }

        public override object GetValue(object component)
        {
            object value = null;
            _values.TryGetValue(component, out value);
            return value;
        }

        public override bool IsReadOnly
        {
            get { return false; }
        }

        public override Type PropertyType
        {
            get { return typeof(object); }
        }

        public override void ResetValue(object component)
        {
            throw new NotImplementedException();
        }

        public override void SetValue(object component, object value)
        {
            var oldValue = GetValue(component);

            if (oldValue != value)
            {
                _values[component] = value;
                OnValueChanged(component, new PropertyChangedEventArgs(base.Name));
            }
        }

        public override bool ShouldSerializeValue(object component)
        {
            throw new NotImplementedException();
        }

        public override void AddValueChanged(object component, EventHandler handler)
        {
            // set a breakpoint here to see WPF attaching a value changed handler
            base.AddValueChanged(component, handler);
        }
    }
}

这篇关于WPF数据绑定 - 的&QUOT例;自定义类型描述符&QUOT;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆