Обновление ListPicker на SelectionChanged - PullRequest
1 голос
/ 29 марта 2011

У меня есть два списка выбора. Когда выбор первого списка изменился, он должен фильтровать данные второго выбора списка. Второй ListPicker xaml похож на это

 <TextBlock HorizontalAlignment="Left" Style="{StaticResource PhoneTextNormalStyle}" TextWrapping="Wrap" Text="text" VerticalAlignment="Bottom"/>
                <toolkit:ListPicker VerticalAlignment="Bottom" Name="CategoryList" ItemsSource="{Binding TransactionCategories, Mode=TwoWay}" SelectedItem="{Binding SelectedTransactionCategory, Mode=TwoWay}">
                <toolkit:ListPicker.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Rectangle Fill="Red" Width="24" Height="24"/>
                            <TextBlock Text="{Binding CategoryName,Mode=TwoWay}" Margin="12 0 0 0"/>
                        </StackPanel>
                    </DataTemplate>
                </toolkit:ListPicker.ItemTemplate>
                <toolkit:ListPicker.FullModeItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" Margin="16 21 0 20">
                            <Rectangle Width="43" Height="43"/>
                            <TextBlock Text="{Binding CategoryName, Mode=TwoWay}" Margin="16 0 0 0" FontSize="43" FontFamily="{StaticResource PhoneFontFamilyLight}" TextWrapping="Wrap"/>
                        </StackPanel>
                    </DataTemplate>
                </toolkit:ListPicker.FullModeItemTemplate>
            </toolkit:ListPicker>

Первый сборщик запускает событие GroupCategoryList_SelectionChanged

 private void GroupCategoryList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var category = (TransactionGroupCategory) GroupCategoryList.SelectedItem;
        ((TransactionEditViewModel)DataContext).FilterCategoryByGroup(category.GroupCategoryId);
    }

Это метод в ViewModel

 public  void FilterCategoryByGroup(int groupCategoryId)
    {

        TransactionCategories = ToObservableCollection(DatabaseBl.GetData<TransactionCategory>().Where(x => x.GroupCategoryId == groupCategoryId).OrderByDescending(tc => tc.TransactionCount));
        if (TransactionCategories.Count > 0)
            SelectedTransactionCategory = TransactionCategories[0];
    }

Второй инструмент выбора списка никогда не обновляется в пользовательском интерфейсе, даже если новые данные были получены методом фильтрации. Что может быть не так с этим. Обязательный вопрос может быть?

1 Ответ

3 голосов
/ 29 марта 2011

Не глядя на остальную часть кода модели представления, обычное подозрение здесь заключается в том, что вы заменяете наблюдаемую коллекцию в модели представления, а не модифицируете ее. Если ваша модель представления не запускает событие NotifyPropertyChanged при установке TransactionCategories, то представление не будет знать об изменениях.

Лучшим подходом IMO для этого является не замена всей коллекции, а ее изменение, возможно, при вызове Clear и Add для повторного заполнения коллекции. Затем коллекция будет запускать события Collection Changed, которые будет замечать представление.

...