Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > DataGrid Binding и колонка с MyClass


Автор: Человек01 20.2.2009, 20:47
Диспозиция: Есть 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, но он уведомляет только если ссылка непосредственно на свойство, но у меня ссылка как бы на весь класс. 


Автор: Partizan 20.2.2009, 21:39
Человек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...но это так, к слову...думаю в вашем случае скорость особо не критична..


Автор: Человек01 20.2.2009, 21:52
Спасибо за столь быстрый ответ, но почему то, не помогло.
Кстати, я пробовал передавать и пустую строку в качестве параметра 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 изменяется

Автор: Partizan 20.2.2009, 21:59
Человек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>

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)