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
放入IClassA
和IClassB
的基础界面,尚未,所以我对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导致搜索结果不足的原因可能是不完全知道要搜索的内容。
答案 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; }
}
结果: