2013-02-14 55 views
1
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可以不予考虑,但,所以我好奇经由数据在WPF结合结合dynamic性质。这是,我曾尝试:

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设计/ ReSharper的告诉我:无法在类型“对象”的数据上下文解决财产“描述”。

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

我可能误解了这种情况下的原理dynamic,我不知道。因此,使用Google的搜索结果不足可能是由于不完全知道要搜索什么造成的。

+0

您是否在运行时收到绑定错误?什么是错误? – 2013-02-14 01:22:42

+1

绑定已经相当动态,所以你可以使用Object作为实例类型。您仍然会收到设计时警告,但它会在运行时运行。 – 2013-02-14 01:23:25

+0

TextBlock可能是空的,因为没有通知来告诉Xaml它已经改变。 – 2013-02-14 01:37:55

回答

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

+1

谢谢。这正是我所发现的。我的问题是,如果设置了属性'Description',则引发'PropertyChanged'。虽然'实例'没有。我监督了这一点,所以我只是。 – 2013-02-14 01:45:00