如何绑定到动态类型的属性?

时间:2013-02-14 01:18:13

标签: c# wpf xaml data-binding

public interface IClassA
{
    string Description { get; set; }
    // more IClassA specific definitions
}

public interface IClassB
{
    string Description { get; set; }
    // more IClassB specific definitions
}

public class ClassA : IClassA
{
    public string Description { get; set; }
}

public class ClassB : IClassB
{
    public string Description { get; set; }
}

这是非常简化的代码。为简单起见,所有类都缺少INotifyPropertyChanged实现。只需观察所有代码,就像它正确实现一样。

不能将Description放入IClassAIClassB的基础界面,尚未,所以我对dynamic感到好奇通过WPF中的数据绑定绑定的属性。这就是我的尝试:

public class CustomClass
{
    public dynamic Instance { get; set; }

    // passed instance is a ClassA or ClassB object
    public CustomClass(dynamic instance)
    {
        Instance = instance;
    }
}

我的Xaml包含TextBlock,其DataContext设置为CutomClass对象。如果我将Instance属性的类型更改为例如IClassA并正确填写,一切都按预期工作。但不是dynamic

<TextBlock Text="{Binding Instance.Description}" />

VS2012中的Xaml Designer / ReSharper告诉我:无法解析'object'类型的数据上下文中的属性'Description'。

虽然CodeInstance被描述为dynamic的类型。但编译的代码,所以我认为这可能是一个设计时问题。但TextBlock仍为空。

在这种情况下,我可能会误解原则dynamic,我不知道。因此,使用Google导致搜索结果不足的原因可能是不完全知道要搜索的内容。

1 个答案:

答案 0 :(得分:3)

您可以使用与任何属性相同的方式绑定到动态属性。所以你的问题必须在其他地方表现出来,或ReSharper给出另一个无益的错误,(讨厌那个程序)

动态绑定示例:

的Xaml:

<Window x:Class="WpfApplication7.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="104" Width="223" Name="UI">
    <StackPanel DataContext="{Binding ElementName=UI}">
        <TextBlock Text="{Binding MyProperty}" />
        <TextBlock Text="{Binding MyObject.MyProperty}" />
    </StackPanel>
</Window>

代码:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
        MyProperty = "Hello";
        MyObject = new ObjectTest { MyProperty = "Hello" };
    }

    private dynamic myVar;
    public dynamic MyProperty
    {
        get { return myVar; }
        set { myVar = value; NotifyPropertyChanged("MyProperty"); }
    }

    private dynamic myObject;
    public dynamic MyObject
    {
        get { return myObject; }
        set { myObject = value; NotifyPropertyChanged("MyObject"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string p)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(p));
        }
    }
}

public class ObjectTest
{
    public string MyProperty { get; set; }
}

结果:

enter image description here