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


Автор: drdoom 1.12.2008, 11:48
Вообщем вот такая вот проблема.
Есть форма которая биндиться к данным, а точнее ее ListView это делает следующим образом 
Код

  <ListView Name="lw" Grid.Row="1" ItemsSource="{Binding Data}" View="{Binding ViewSettings.GridView, Mode=TwoWay}" diag:PresentationTraceSources.TraceLevel="High">

так вот Грид вью биндиться к классу ViewSettings. Который определен следующим образом
Код

public class ViewSettings : INotifyPropertyChanged
{
......
 private GridView gridView;
        public GridView GridView
        {
            get { return gridView;} 
            set
            {
                gridView = value;
                OnPropertyChanged("GridView");
            }
        } 
......
        private void OnPropertyChanged(string propName)
        {
            MessageBox.Show("Чето изменилось");
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
......
}

в GridView есть контекстное меню на Заголовке. В этом контекстом меню просто перечислены все столбцы находящиеся в GridView.
Вот в этой функции создается это контекстное меню
Код

  public static ContextMenu GreateContextMenu(ArrayList columnInfoCollection)
        {
            var contextMenu = new ContextMenu();
            foreach (ColumnInfo columnInfo in columnInfoCollection)
            {
                var menuItem = new MenuItem
                {
                    Header = columnInfo.Header,
                    IsCheckable = true,
                    IsChecked = (!columnInfo.Hidden)
                };
                contextMenu.Items.Add(menuItem);
            }
            return contextMenu;
        }


Как вы заметили у элементов есть свойство, которое определяет Стоит ли там галочка или нет. Я предпологал что когда я буду кликать на элементы контекстного меню то будет изменяться GridView и вызываться метод  OnPropertyChanged, где я смогу обработать это изменение, но такого не происходит. 
Почему это происходит не пойму.
Помогите плиз. Зараниее спасибо

Автор: Partizan 1.12.2008, 11:52
drdoom, 

Цитата

Почему это происходит не пойму.


Потому, что значение поля gridView остаётся прежним...

Автор: drdoom 1.12.2008, 11:56
Partizan, А каким образом мне узнать о том что я что то поменял в контекстом меню? причем и с помощью связывания, а не посредством вызова события у элементов контекстного меню

Автор: Partizan 1.12.2008, 11:57
drdoom, обработчик нажатия на MenuItem покажите

Автор: drdoom 1.12.2008, 12:01
вот подписка 
Код

        public static ContextMenu GreateContextMenu(ArrayList columnInfoCollection)
        {
            var contextMenu = new ContextMenu();
            foreach (ColumnInfo columnInfo in columnInfoCollection)
            {
                var menuItem = new MenuItem
                {
                    Header = columnInfo.Header,
                    IsCheckable = true,
                    IsChecked = (!columnInfo.Hidden)
                };
                menuItem.Click+=menuItem_Click;//подписка
                contextMenu.Items.Add(menuItem);
            }
            return contextMenu;
        }

вот обработчкик
Код

        private static void menuItem_Click(object sender, RoutedEventArgs e)
        {
            //здесь делать что-то
        }
проблема в том что этот метод статичный и я не могу  в нем изменить GridView

Автор: Partizan 1.12.2008, 12:18
drdoom, 

Цитата

Я предпологал что когда я буду кликать на элементы контекстного меню то будет изменяться GridView и вызываться метод  OnPropertyChanged, где я смогу обработать это изменение, но такого не происходит.


Интересно каким образом GridView должен поменяться после клика

Автор: drdoom 1.12.2008, 12:19
ну я для проверки поперетаскивал столбцы в нем и менял их ширину, разве он при таких действиях не должен меняться? 

Автор: Partizan 1.12.2008, 12:29
drdoom, вы ж работаете с одним и тем же объектом...когда вы изменяете ширину столбца, объект GridView остаётся тот же...

Автор: drdoom 1.12.2008, 12:32
Partizan, понятно, как же тогда мне отследить изменения в контекстном меню? без события всмысле

Автор: Partizan 1.12.2008, 12:57
drdoom, биндиться к MenuItem.IsChecked

Автор: drdoom 1.12.2008, 15:11
Partizan, точно блин, чет я ступил) спасибо)

Автор: drdoom 2.12.2008, 01:43
А как мне прибиндиться к этому самому IsChecked
вот так вот не проканывает
Код

 IsChecked =new Binding("ViewSettings.ColumnInfoCollection["+columnInfoCollection.IndexOf(columnInfo)+"].Hidden")

Автор: drdoom 2.12.2008, 02:49
вот я короче как прибиндился 
Код

                var menuItem = new MenuItem
                                   {
                                       Header = columnInfo.Header,
                                       IsCheckable = true,
                                   };
                Binding binding = new Binding("ViewSettings.VisibleStatusCollection[" + columnInfoCollection.IndexOf(columnInfo) + "]");
                binding.Mode = BindingMode.TwoWay;
                menuItem.SetBinding(MenuItem.IsCheckedProperty,binding);

вот свойство VisibleStatusCollection
Код

private List<bool> visibleStatusCollection;
        public List<bool> VisibleStatusCollection
        {
            get { return visibleStatusCollection; }
            set
            {
                visibleStatusCollection = value;
                OnPropertyChanged("ViewSettings.VisibleStatusCollection");
            }
        }

бинидться нормально то ест значения берет, но когда я кликаю на одном из пунктов контекстного меню, событие OnPropertyChange не вызывается
всю голову уже об стену разбил, почему не работает?

Автор: Partizan 2.12.2008, 11:42
drdoom, попробуйте поменять List на ObservableCollection

Автор: drdoom 2.12.2008, 11:58
спасибо вроде работает)

Автор: drdoom 2.12.2008, 12:56
еще одна проблема возникла вот у мя объявлен крид с привзякойо к свойству
Код

<ListView Name="lw" Grid.Row="1" ItemsSource="{Binding Data}" View="{Binding ViewSettings.GridView, Mode=TwoWay}" diag:PresentationTraceSources.TraceLevel="High">

а вот я подписался на событе коллектин ченйж вот этой фукнцией 
Код

        private void visibleStatusCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            for (int i = 0; i < columnInfoCollection.Count; i++)
                ((ColumnInfo)columnInfoCollection[i]).Visible = VisibleStatusCollection[i];
            GridView = CreateGridView(columnInfoCollection);
        }

здесь я пытаюсь грохнуть грид вью и создать новый, но почему то ниче не менятся после выполнения этой функциии

Автор: Partizan 2.12.2008, 18:08
drdoom, CreageGridView что делает?

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