Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Привязка текста к свойству из класса 
:(
    Опции темы
fromrus
Дата 16.10.2008, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 30.3.2008

Репутация: нет
Всего: нет



Ссылка на оригинал

http://social.msdn.microsoft.com/Forums/en...73-9022034c6722

Повторюсь:нужно всего лишь привязать свойство к элементу?На мсдн форуме посоветовали то,что вы видите выше...В книгах я такого не встречал,везде привязывалось "напрямую".Кому верить?Чтоб привязать нужно свойство регистрировать целое?
PM MAIL ICQ   Вверх
Partizan
Дата 16.10.2008, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



fromrus, с DependencyProperty точно заработает...

но в конце топика там посоветовали присовить объект содержащий свойство Chairs в качестве DataContext текстблоку


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
fromrus
Дата 16.10.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 30.3.2008

Репутация: нет
Всего: нет



попробовал присвоить DataContеxt Textblock'a "this",а потом и "Window1" -не работает даж в случае Dep prop...
PM MAIL ICQ   Вверх
Partizan
Дата 16.10.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



fromrus, ElementName пробовали установить?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
rooks
Дата 17.10.2008, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.9.2008
Где: Минск

Репутация: 5
Всего: 9



Цитата(fromrus @ 16.10.2008,  21:53)
попробовал присвоить DataContеxt Textblock'a "this",а потом и "Window1" -не работает даж в случае Dep prop...

если класс не статический, то Binding нужно писать в коде а не в xaml-е
PM MAIL ICQ   Вверх
Idsa
Дата 18.10.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



fromrus, правильно ли я понял, что Вам нужно привязать к элементу свойство из codebehind этого же класса? С такой задачей я как раз столкнулся вчера и, подумав, реализовал следующим образом:
Код

Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=StrokeThickness, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

Работает так: добираемся по дереву до окна и считываем/записываем его свойство FillBrush (которое должно быть public). Работает, но не так, как хотелось бы. Во-первых, весь этот огород с RelativeSource - не самое красивое и производительное решение. Во-вторых, без реализации интерфейса INotifyPropertyChanged в классе формы (а реализовывать этот интерфейс в классе формы, на мой взгляд, неправильно) как такового TwoWay режима не получится: Binding движок не узнает о том, что Вы в коде изменили значение переменной. Поэтому при каждом изменении переменной в коде необходимо ручками вызывать UpdateSource... так что баиндинг теряет смысл.
Взглянув на это безобразие, решил перенести свойства из формы в отдельный статический класс настроек (который к тому же реализовывал бы INotifyPropertyChanged). Однако, и с реализацией этой идеи меня ждал неприятный сюрприз (карма у меня такая smile ). Дело в том, что TwoWay binding со статическим свойством реализовать невозможно.
Код

Text="{Binding Source={x:Static Someclass.SomeProperty"}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

С модификатором TwoWay данный вариант не прокатит. Binding из Source в Target очевиден: свойству Text присваем ссылку, которую получаем из Source. Однако в обратном направлении баиндинг невозможен: какому свойству Source присвоить новое значение указывается через свойство Path, которое в этом случае не задается. Поэтому такой вариант возможен только для OneWay привязки.

На workaround меня натолкнул этот блогпост: http://pavanpodila.spaces.live.com/blog/cn...59398!301.entry (последний коммент must read).
Я реализовал singleton класс, реализующий интерфейс INotifyChanged. Singleton в этом случае нужен для эмуляции статического класса.
Код

 public class Settings : INotifyPropertyChanged
  {
    private static Settings _instance;

    private Settings()
    {

    }

    public static Settings Instance
    {
      get
      {
        if (_instance == null)
          _instance = new Settings();
        return _instance;
      }
    }

    private SolidColorBrush _strokeBrush;
    public SolidColorBrush StrokeBrush
    {
      get
      {
        return this._strokeBrush;
      }
      set
      {
        this._strokeBrush = value;
        this.NotifyPropertyChanged("StrokeBrush");
      }
    }

    private int _strokeThickness;
    public int StrokeThickness
    {
      get
      {
        return this._strokeThickness;
      }
      set
      {
        this._strokeThickness = value;
        this.NotifyPropertyChanged("StrokeThickness");
      }
    }

    private SolidColorBrush _fillBrush;
    public SolidColorBrush FillBrush
    {
      get
      {
        return this._fillBrush;
      }
      set
      {
        this._fillBrush = value;
        this.NotifyPropertyChanged("FillBrush");
      }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string info)
    {
      if (this.PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
  }

Теперь я могу баиндить настройки вот таким элегантным (и более производительным, чем через RelativeSource) способом:
Код

Text="{Binding Source={x:Static local:Settings.Instance}, Path=StrokeThickness, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"


Добавлено @ 14:57
Забыл добавить, что, действительно, можно реализовать данный функционал через DependencyProperties. Это, как минимум, избавит программиста от необходимости реализации интерфейса INotifyPropertyChanged.

Это сообщение отредактировал(а) Idsa - 18.10.2008, 15:23


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0481 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.