WPF-DataBinding-Resrouce - применение нового значения к ресурсу не влияет на связанные элементы управления - PullRequest
0 голосов
/ 08 августа 2011

мой код как удар:
Xaml:

<UserControl.Resources>
  <Bll:HandHeld x:Key="hh" >            
  </Bll:HandHeld>
</UserControl.Resources>

Другой Xaml для переплета

<TextBox  Name="txtHHName" 
  Text="{Binding Source={StaticResource hh}, Path=HandHeldName, Mode=TwoWay}" />

и в моем коде Csharp:

HandHeld hh = this.FindResource("hh") as HandHeld;
hh.HandHeldName="testing";

этот код работает нормально, потому что мой класс HandHeld реализует INotifyPropertyChanged, но когда я хочу применить свойство к собственному ресурсу, оно не применяется к текстовым полям, связанным с этим.

HandHeld hh = this.FindResource("hh") as HandHeld;
hh=new HandHeld(); //this line doest not affect. why ?

или это тоже не работает.

this.resources["hh"]=new HandHeld();//this doesnt have any affect too.

почему?

Ответы [ 2 ]

0 голосов
/ 08 августа 2011

Хорошо, как вы можете сделать это

  1. Измените привязку StaticResource на DynamicResource (убедитесь, что вы делаете это везде, где hh упоминается как StaticResource)

    <TextBox  Name="txtHHName" Text="{Binding Source={DynamicResource hh}, Path=HandHeldName, Mode=TwoWay}" />
    
  2. Удалить ресурс из коллекции ресурсов и добавить новый с тем же ключом ...

    this.Resources.Remove("hh");
    this.Resources.Add("hh", new HandHeld()); //this line should take affect. 
    

Пожалуйста, проверьте и дайте мне знать, если это работает.

0 голосов
/ 08 августа 2011

Прежде всего,

HandHeld hh = this.FindResource("hh") as HandHeld;
hh=new HandHeld(); 

&

this.resources["hh"]=new HandHeld();

- это не одно и то же.Первая реализация работает с объявлением объекта внутри кода (что, очевидно, не должно иметь никакого эффекта), а вторая - с объектом xaml класса HandHeld .

Второй не имеет никакого эффекта, так как когда вы устанавливаете объект, нет ничего, чтобы уведомить об изменении.Таким образом, вы либо реализуете одно, либо создаете свойство зависимости в текущем коде позади себя.

public static readonly DependencyProperty HandHeldObjProperty =
            DependencyProperty.Register("HandHeldObj", typeof(HandHeld), typeof(UserControl),new PropertyMetadata(null));            

Свяжите указанное выше свойство зависимости в XAML с источником.И всякий раз, когда вы хотите установить значение,

SetValue(HandHeldObjProperty, new HandHeld());


РЕДАКТИРОВАТЬ:

Я подумал, что у вас есть место, где вы особенно хотите привязать свой объект к,Что-то вроде проверки, является ли объект (объект HandHeld) нулевым или нет.

Если это не так, написанный вами код должен работать.Вы установили свойство зависимости HandHeldName после запуска класса?Я имею в виду ..

this.resources["hh"]=new HandHeld();
hh.HandHeldName="testing";
...