Почему сбой привязки данных в ListView (WPF)? - PullRequest
1 голос
/ 17 мая 2010

У меня есть ListView, для которого ItemSource настроен для моей пользовательской коллекции.

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

           <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

{ Ключ строки; строковое значение;

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);

        }           
    }

Моя коллекция Custom - это ObservableCollection.

У меня есть две кнопки - «Вверх» и «Вниз» в верхней части списка управления. Когда пользователь нажимает кнопку «Переместить вверх» или «Переместить вниз», я вызываю метод «Переместить» из наблюдаемой коллекции.

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

Я убедился, что selectedItem не равен нулю при выполнении команд «Вверх» и «Вниз».

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

Ответы [ 3 ]

1 голос
/ 17 мая 2010

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

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

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

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

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

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

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

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

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

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

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

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 голосов
/ 17 мая 2010

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

0 голосов
/ 17 мая 2010

Поменяйте местами эти строки:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...