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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DataGrid Binding и колонка с MyClass 
V
    Опции темы
Человек01
Дата 20.2.2009, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 20.2.2009
Где: Абакан, респ. Хак асия, Россия

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



Диспозиция: Есть DataGrid в одной из колонок храниться 
мой класс Cl
Код

public class Cl : System.ComponentModel.INotifyPropertyChanged
{
        private bool visibl;
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        void OnPropertyChanged(String prop)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
        public bool Visible
        {
            get{return visibl;}
            set{ visibl=value; OnPropertyChanged("visibl"); }
        }
}


Колонка определена:
Код

<wpf:DataGridTemplateColumn x:Key="dgTemlColumnAndCellView" Header="XXXXX" Width="200" >
        <wpf:DataGridTemplateColumn.CellTemplate>
                <DataTemplate DataType="evrika:Cl">
                    <WrapPanel>
                        <TextBox Text="{Binding Path=numberss, UpdateSourceTrigger=PropertyChanged,  Converter={StaticResource ClDataConverter},
                        ConverterParameter=visible}"/>
                    </WrapPanel>
                </DataTemplate>
       </wpf:DataGridTemplateColumn.CellTemplate>
</wpf:DataGridTemplateColumn>


Соответственно для отображения в колонке выбирается только одно свойство из класса Cl. Получение данного свойства осуществляется с помощью IValueConverter Вот его код
Код

public class ClDataConverter : IValueConverter
{
        public object Convert(object o, Type type, object parameter, CultureInfo culture)
        {
            if (o.GetType() == typeof(Cl))
            {                
                Cl c = (Cl)o;
                if (parameter.Equals(visible))
                    return c.Visible;
            }
            return false;
        }
}


Вопрос: как сделать так чтобы при изменении этого свойства(Где нибудь в коде или в базе не важно) визуальное отображение данной колонки обновилось. 

Помимо реализации DependencyProperty(Кстати если реализовать поможет?). 
Как видно из кода, пробовал реализовать INotifyPropertyChanged, но он уведомляет только если ссылка непосредственно на свойство, но у меня ссылка как бы на весь класс. 


PM MAIL ICQ   Вверх
Partizan
Дата 20.2.2009, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


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

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



Человек01, у Вас небольшая ошибка в реализации INotifyPropertyChanged:

В качестве параметра OnNotifyPropertyChanged должно быть название свойства...

Код

public class Cl : System.ComponentModel.INotifyPropertyChanged
{
        private bool visibl;
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        void OnPropertyChanged(String prop)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
        public bool Visible
        {
            get{return visibl;}
            set{ visibl=value; OnPropertyChanged("Visible"); }
        }
}



P.S. Есть мнение, что наследование DependencyObject и реализация DependencyProperty будут работать быстрее, чем вариант с INotifyPropertyChanged...но это так, к слову...думаю в вашем случае скорость особо не критична..




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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 20.2.2009
Где: Абакан, респ. Хак асия, Россия

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



Спасибо за столь быстрый ответ, но почему то, не помогло.
Кстати, я пробовал передавать и пустую строку в качестве параметра OnNotifyPropertyChanged, насколько мне известно это говорит INotifyPropertyChanged, что надо обновить все связанные элементы. Безрезультатно.

Изменения в колонке с Cl элементами я делаю по нажатию кнопки, если грубо то вот так:
Код

((Cl)((DataRowView)datagrid1.Items[0]).Row["numberss"]).Visible = false;
 
Но эффекта это не дает, видимо это связанно с тем что при Binding текста в TextBox я использую Binding Path=numberss (numberss  это колонка содержащая Cl элементы) таким образом я ссылаюсь на класс, а не на свойство этого класса. 
И когда идет вызов OnNotifyPropertyChanged он честно отрабатывая, оповещает все элементы забинденные  на него, каковых получается что нет(ведь работа с ним идет в конверторе).

А вот, если сделать так:
Код

Cl c=new Cl();
c.Visible=false;
(DataRowView)datagrid1.Items[0]).Row["numberss"]=c;


То отображение в TextBox изменяется


Это сообщение отредактировал(а) Человек01 - 20.2.2009, 21:58
PM MAIL ICQ   Вверх
Partizan
Дата 20.2.2009, 21:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


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

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



Человек01, неудивительно, что оно у вас не работает...Вы же не к свойству биндитесь...

попробуйте так:

Код

<wpf:DataGridTemplateColumn x:Key="dgTemlColumnAndCellView" Header="XXXXX" Width="200" >
        <wpf:DataGridTemplateColumn.CellTemplate>
                <DataTemplate DataType="evrika:Cl">
                    <WrapPanel>
                        <TextBox Text="{Binding Path=numberss.Visible}"/>
                    </WrapPanel>
                </DataTemplate>
       </wpf:DataGridTemplateColumn.CellTemplate>
</wpf:DataGridTemplateColumn>


Это сообщение отредактировал(а) Partizan - 20.2.2009, 22:02


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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 20.2.2009
Где: Абакан, респ. Хак асия, Россия

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



Partizan Огромное Спасибо, это правда оказалось до гениальности просто  smile   я и не знал что так можно.
И оказалось мое использование конвертера вообще лишняя надстройка.
Еще раз спасибо.
P.S.: а я ведь целый день вокруг да около ходил  smile, но я WPF учу ещё только 4й день, мне можно smile
Тема закрыта.

Это сообщение отредактировал(а) Человек01 - 20.2.2009, 22:11
PM MAIL ICQ   Вверх
Partizan
Дата 20.2.2009, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


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

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



Человек01, Не забывайте пометить вопрос как решённый (Ссылка справа от Заголовка темы)


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




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


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

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