2010-05-17 4 views
1

У меня есть ListView, для которого ItemSource установлен в мою пользовательскую коллекцию.Почему сбой в привязке данных в ListView (WPF)?

Я определил GridView CellTemplate, который содержит поле со списком, как показано ниже:

  <ListView 
      MaxWidth="850"     
      Grid.Row="1" 
      SelectedItem="{Binding Path = SelectedCondition}" 
      ItemsSource="{Binding Path = Conditions}"     
      FontWeight="Normal" 
      FontSize="11"         
      Name="listview"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn       
         Width="175" 
         Header="Type"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <ComboBox          
            Style="{x:Null}" 
            x:Name="TypeCmbox" 
            Height="Auto" 
            Width="150" 
            SelectedValuePath="Key" 
            DisplayMemberPath="Value"  
            SelectedItem="{Binding Path = MyType}" 
            ItemsSource="{Binding Path = MyTypes}" 
            HorizontalAlignment="Center" /> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
       </ListView> 


public MyType : INotifyPropertyChanged 

{ строку Key; строка Значение;

public string Key { get { return _key; } 
    set { _key = value; this.OnPropertyChanged("Key"); } } 

public string Value { get { return _value; } 
    set { _value = value; this.OnPropertyChanged("Value"); } } 

    public MyType() 
    { 


    } 

    public MyType (string key, string value) 
    { 
     _key = key; 
     _value = value; 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = this.PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 


    #endregion 

}

public void MoveUpExecuted() 
    { 
     int oldIndex = this.Conditions.IndexOf(_selectedCondition); 

     //Check if the selected item is not the first item 
     if (oldIndex != 0) 
     { 
      int newIndex = oldIndex - 1; 
      this.Conditions.Move(oldIndex, newIndex); 

     }   
    } 

Мой заказ коллекция является ObservableCollection.

У меня есть две кнопки - Move Up и Move Down сверху элемента управления списком. Когда пользователь нажимает кнопку «Вверх» или «Вниз», я вызываю метод Move Observable Collection.

Но когда я перехожу вверх и перемещаюсь по строкам, то выбранный индекс комбинированного поля равен -1.

Я установил, что selectedItem не равен нулю при выполнении команд Move Up и Move Down.

Пожалуйста, помогите !!

ответ

1

Я не получаю эту часть:

Я называю Методы MoveUp и MoveDown для Наблюдаемая коллекция.

ObservableCollection не имеет таких методов, по крайней мере, насколько мне известно? Также не имеет понятия текущего элемента или подобного.

Приносим извинения, если я пропустил что-то, что могло бы сделать это сообщение невежественным.

Что вы можете сделать, а не связывать ListView с ObservableCollection, вы можете привязать его к ICollectionView (полученному из вашего ObservableCollection). Если вы установите IsSynchronizedWithCurrentItem = True в ListView, вам не нужно связывать SelectedItem, он автоматически привязан к CurrentItem на ICollectionView.

ICollectionView также реализует MoveCurrentToNext и MoveCurrentCurrentToPrevious, которые могут быть связаны с вашими кнопками (через ICommand).

EDIT: Теперь, когда новая информация находится на столе, мой вышеприведенный ответ больше не имеет отношения к делу. Но я еще не знаю соглашение SO, как справиться с этим, если я должен полностью удалить сообщение, отредактируйте вышеизложенное или просто добавьте «новый» ответ. Сейчас я отредактирую этот пост.

Я попытался воссоздать ваш проект и вашу проблему. Надеюсь, я правильно понял вашу проблему и, по крайней мере, воссоздал ее.

Как и проблема в том, что combobox не сохраняет свое значение, когда он перемещается в списке, он работает для меня.

Ниже приведены соответствующие коды (некоторые из них скрыты, чтобы избежать слишком большого шума).

Вам это поможет?

public class MainWindowViewModel:INotifyPropertyChanged 
    { 
     private Condition _selectedCondition; 
     public ObservableCollection<Condition> Conditions { get; set; } 

     public Condition SelectedCondition 
     { 
      get 
      { 
       return _selectedCondition; 
      } 
      set 
      { 
       if (_selectedCondition != value) 
       { 
        _selectedCondition = value; 
        OnPropertyChanged("SelectedCondition"); 
       } 
      } 
     } 
... 
public void MoveUpExecuted() 
    { 
     int oldIndex = this.Conditions.IndexOf(_selectedCondition); 

     //Check if the selected item is not the first item 
     if (oldIndex != 0) 
     { 
      int newIndex = oldIndex - 1; 
      this.Conditions.Move(oldIndex, newIndex); 
     } 
    } 

И условие класс:

public class Condition : INotifyPropertyChanged 
    { 
     private MyType myType; 
     public ObservableCollection<MyType> MyTypes { get; set; } 

     public MyType MyType 
     { 
      get { return myType; } 
      set 
      { 
       if (myType != value) 
       { 
        myType = value; 
        OnPropertyChanged("MyType"); 

       } 
      } 
     } 


     public Condition() 
     { 
      MyTypes = new ObservableCollection<MyType>() { new MyType() { Key = "1", Value = "One" }, new MyType() { Key = "2", Value = "Two" } }; 
      MyType = MyTypes[1]; 
     } 

... и т.д.

<ListView 
      SelectedItem="{Binding Path=SelectedCondition}" 
      ItemsSource="{Binding Path=Conditions}"     
      FontWeight="Normal" 
      FontSize="11"         
      Name="listview" Margin="0,32,0,0"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn       
         Width="175" 
         Header="Type"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <ComboBox          
            Width="150" 
            SelectedValuePath="Key" 
            DisplayMemberPath="Value"  
            SelectedItem="{Binding Path=MyType}" 
            ItemsSource="{Binding Path=MyTypes}" 
            HorizontalAlignment="Center" /> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
       </GridView> 
      </ListView.View> 
     </ListView> 
     <Button Content="Move up" 
       Command="{Binding MoveUpCommand}" 
       /> 
+0

Спасибо за ответ. Извините за неправильные имена ObservableCollection, его метод Move в ObservableCollection, который перемещает объект в коллекции от oldindex к новому индексу –

+0

А я вижу. Итак, просто чтобы быть ясным, вы хотите переместить объект сам, как в порядке изменения элементов, а не переместить выделение, как я думал? – ThomasAndersson

+0

Да, я выбрал выбранный элемент ListView текущему перемещаемому объекту, который дает выбор в списке. –

0

своп эти строки:

SelectedItem="{Binding Path = SelectedCondition}" 
ItemsSource="{Binding Path = Conditions}" 

ItemSource должен быть перед SelectedItem

+0

Спасибо за ответ Daniel, это dosen't помогло .. –

+0

Вы пытались манипулировать SelectedIndex в списке, а не методах Move на наблюдаемом наборе, я никогда не использовал их сам. – Daniel

+0

Я попытался установить выбранный Index = 0 (hardcoded), но это также не помогает мне ... –

0

Пробовали ли вы ItemsSource="{Binding Conditions}"

+0

Я пробовал только сейчас, но он не решает проблему. Я все еще не могу сохранить выбранный индекс поля со списком listview. –

+0

некоторый код поможет. Также QuickWatch свойство MyType при выполнении операции MoveUp. – Amsakanna

+0

Из вашего кода видно, что MyType - это модель, а MyTypes - это список. Но не знаете, почему вы привязываете выбранный элемент к MyType. Разве это не должно быть SelectedMyType, свойство, которое нужно создать? – Amsakanna

Смежные вопросы