2013-11-06 5 views
1

У меня есть класс с именем Date который переопределяет его ToString и возвращает его через свойство:новый экземпляр объекта Перерывы Связывание

public string DateString 
{ 
    get { return ToString(); } 
} 

Мой экземпляр Date проводится в классе контейнера и манипулировать ими оттуда. В XAML, переопределенный ToString отображается следующим образом:

<TextBlock Text="{Binding Container.Date.DateString, Source={StaticResource Locator}}" /> 

Локатор определяется в App.xaml:

<data:Locator x:Key="Locator" /> 

Класс Локатор включает в себя:

public class Locator 
{ 
    static Locator() 
    { 
     Container = new GameContainer(); 
    } 

    public static GameContainer Container { get; set; } 
} 

GameContainer включает в себя:

public class GameContainer 
{ 
    public GameContainer() 
    { 
     Date = new Date(); 
    } 

    public Date Date { get; set; } 
} 

У меня есть lso попробовал это с контейнерами IOC без везения.

Когда программа запущена, все ведет себя правильно; нажатие кнопки увеличивает дату (и вызывает RaisePropertyChanged на DateString). Однако, если я создаю новый экземпляр контейнера или новый экземпляр Date, пользовательский интерфейс больше не обновляется, и я не могу понять, почему. Это происходит только после того, как произошло взаимодействие с пользователем; Я могу создать новый экземпляр на разных этапах инициализации программы без каких-либо проблем, но после нажатия кнопки вызывает создание нового экземпляра, строка больше не обновляется.

Я пробовал все, что я могу придумать, и я не могу понять, что вызывает это. Любая помощь будет оценена по достоинству.

Update: В настоящее время моего Dependency Property выглядит следующим образом:

public static readonly DependencyProperty ContainerProperty = 
     DependencyProperty.Register("Container", typeof(GameContainer), typeof(Locator)); 

    public static GameContainer Container 
    { 
     get { return (GameContainer)GetValue(ContainerProperty); } 
     set 
     { 
      SetValue(ContainerProperty, value); 
     } 
    } 

Я получаю эту ошибку: Ссылка на объект требуется для нестатических полей, методы или свойств «System.Windows.DependencyObject .GetValue (System.Windows.DependencyProperty)»

+0

'Однако, если я создам новый экземпляр контейнера или новый экземпляр Date, пользовательский интерфейс больше не будет обновляться, и я не могу понять почему. ': ты уверен, что делаешь это в том же экземпляре« Локатора », который связан? Я спрашиваю, потому что «Локатор» не является «статическим» классом, поэтому у вас будут проблемы с синхронизацией. –

+0

Создание статичного 'Locator' не имеет значения. –

+0

Как вы создаете новый экземпляр контейнера, в то время как привязки в пользовательском интерфейсе все те же? Я подозреваю, что ваш экземпляр Locator по-прежнему связан с пользовательским интерфейсом, поэтому, когда вы создаете новый экземпляр, он не обновляется. Когда вы хотите создать новый экземпляр? –

ответ

2

Похоже, у вас нет какой-либо свойства изменен механизм уведомления, это очень важно, чтобы сделать Binding работу должным образом. Попробуйте реализации INotifyPropertyChanged или создания соответствующего DependencyProperty, я познакомлю с использованием DependencyProperty в этом случае:

public class GameContainer : DependencyObject { 
    public GameContainer() { 
    Date = new Date(); 
    } 
    public static readonly DependencyProperty DateProperty = 
     DependencyProperty.Register("Date", typeof(Date), typeof(GameContainer)); 
    public Date Date { 
    get { return (Date) GetValue(DateProperty);} 
    set { 
     SetValue(DateProperty, value); 
    } 
    } 
} 

ПРИМЕЧАНИЕ: сделать то же самое для свойства Container в классе Locator.

Я действительно смущен, так как Binding имеет дело со статическим свойством. Это все, что я могу придумать как код необходимости:

public class Locator {  
    static Locator() { 
    Container = new GameContainer(); 
    } 
    public static event EventHandler ContainerChanged; 
    static GameContainer container; 
    public static GameContainer Container { 
    get { return container;} 
    set { 
     if(container != value){ 
      container = value; 
      var handler = ContainerChanged; 
      handler(null, EventArgs.Empty); 
     } 
    } 
    }  
} 
+0

У меня уже есть INPC; вот как это работает в первую очередь. Я попробую свойства зависимостей и дам вам знать, работает ли это. –

+0

@JasonD извините, см. Обновление, 'GameContainer' должен унаследовать от' DependencyObject'. –

+0

@JasonD в первую очередь, это сработало для вас, потому что ваш 'Date' не был ** фактически ** изменен, только один из его членов« Данные »изменился. Кстати, я испытал ** странную ** вещь, которая иногда «INotifyPropertyChanged» не работает, но «DependencyProperty» работает нормально. –

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