Как изменить данные в выбранном ListViewItem?

Рейтинг: 1Ответов: 1Опубликовано: 10.01.2015

Когда я делаю Hold event на ListView я получаю свой Item в обрабочик. Сейчас как мне можно изменить какое либо значение в выбранном ListBoxItem?

Репутация не позволяет вставить скрин.

async void Add_To_Favorites(object sender, RoutedEventArgs e)
        {
            SQLiteConnection connection = new SQLiteConnection(dbPath);
            var stop = (e.OriginalSource as FrameworkElement).DataContext as Model.StopsTable;
            connection.Query<Model.StopsTable>("update stops set favorites = 'True' where id = " + stop.id);

            List<Model.StopsTable> StopNames = await Task.Run(() => Load_Stops(parameter));
            RoutesStopNamesList.ItemsSource = StopNames;
           (**1**)
        }
В пункте 1 нужно вместо верхних 2х строчек просто изменить символ в ListViewItem. Так как я не умею то загружаю данные снова и по логике приложения оно изменяет символ само, но при этом скролл прокручивается вверх ListView.

Вывожу в таком XAML'e:

<Grid x:Name="ContentPanel" Background="White" HorizontalAlignment="Center" Height="552" Margin="0,88,0,-20" VerticalAlignment="Top" Width="400">
            <ListView x:Name="RoutesStopNamesList" Background="White"  Margin="20,10,20,20" SelectionChanged="SelectStopNameTime">
                <ListView.ItemContainerStyle>
                    <Style TargetType="ListViewItem">
                        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                    </Style>
                </ListView.ItemContainerStyle>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel x:Name="MainStackPanel" Background="White" Orientation="Horizontal" Height="70" Holding="Grid_Holding">
                            <SymbolIcon x:Name="SymbolIconChange"  Symbol="{Binding Path=symbol}" Foreground="{Binding Path=color}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,0,10,0"/>
                            <StackPanel VerticalAlignment="Center">
                                <TextBlock Text="{Binding Path=name}" Foreground="Black" TextWrapping="WrapWholeWords" FontSize="20" Width="290"></TextBlock>
                                <TextBlock Text="{Binding Path=next_bus}" Foreground="DarkGray" FontSize="14" TextWrapping="Wrap" HorizontalAlignment="Left"></TextBlock>
                            </StackPanel>
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </Grid>

Модель:

public class StopsTable
    {
        public int id { get; set; }
        public int n_id { get; set; }
        public int r_id { get; set; }
        public int s_id { get; set; }
        public int d_id { get; set; }
        public string weekdays { get; set; }
        public string saturday { get; set; }
        public string sunday { get; set; }
        public string name { get; set; }
        public string direction_name { get; set; }
        public string num { get; set; }
        public string favorites { get; set; }
        public string symbol { get; set; }
        public object color { get; set; }
        public string next_bus { get; set; }
    }

В итоге при запуске Add_To_Favorites метода происходит добавление определенной остановки в избранное, в этот момент мне нужно просто поменять символ в выбранном item. Сначала там стоит просто Star символ, а мне надо на SolidStar.

Ответы

▲ 1Принят

Вроде бы ясно. Смотрите, в чём проблема.

С точки зрения дизайна программы, ваша коллекция — не ViewModel-, а Model-элементы. Это не вполне правильно с точки зрения реализации паттерна MVVM, View не должен видеть Model, а только ViewModel.

С технической точки зрения, изменения в свойствах StopsTable не видны вашему контролу потому, что StopsTable не реализует INotifyPropertyChanged (и содержит обыкновенные свойства, а не DependencyProperty), и таким образом контролу просто неоткуда узнать, что у вас там поменялось значение.

Как решать?

  1. Если вы пишете программу с MVVM, вам нужно иметь коллекцию VM-объектов.
  2. Если вы хотите остаться в рамках текущего дизайна, вам нужно реализовать INotifyPropertyChanged в StopsTable.