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のベースインターフェイスに入れるIClassAことはまだIClassB検討できません。そのため、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のXamlDesigner/ ReSharperは、次のように表示します。タイプ'object'のデータコンテキストでプロパティ'Description'を解決できません

のタイプCodeInstanceとして記述されていますがdynamic。しかし、コードがコンパイルされたので、設計時の問題かもしれないと思いました。しかし、TextBlock残りは空のままです。

この場合の原理を誤解するかもしれませんが、dynamicわかりません。したがって、Googleを使用した検索結果の欠如は、何を検索するかを正確に知らないことが原因である可能性があります。

4

1 に答える 1

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; }
}

結果:

ここに画像の説明を入力してください

于 2013-02-14T01:33:23.933 に答える