2013-02-14 2 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 в базовый интерфейс для 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}" /> 

Xaml Дизайнер/ReSharper в VS2012 говорит мне: Не удается разрешить свойство «Описание» в контексте данных типа «объекта».

Хотя CodeInstance описывается как тип dynamic. Но код скомпилирован, поэтому я подумал, что это может быть проблема времени разработки. Но TextBlock остается пустым.

Я мог бы неправильно понять принцип dynamic в этом случае, я не знаю. Таким образом, отсутствие результатов поиска с помощью Google может быть вызвано не точно зная, что искать.

+0

Вы получаете ошибку привязки во время выполнения? Какая ошибка? –

+1

Связывание уже довольно динамично, поэтому вы можете использовать Object для типа Instance. Вы по-прежнему будете получать предупреждения о времени разработки, но это будет работать во время выполнения. –

+0

TextBlock, вероятно, пуст, потому что нет уведомления, чтобы сообщить Xaml, что он изменился. –

ответ

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

Спасибо. Это было именно то, что я узнал. Моя проблема заключалась в том, что свойство 'Описание' подняло' PropertyChanged', если оно было установлено. Однако «Экземпляр» не сделал. Я наблюдал за этим, так что я просто был. –

Смежные вопросы