Привязка данных ListPicker SelectedItem становится пустым при изменении SelectedIndex - PullRequest
0 голосов
/ 05 октября 2011

В моем приложении для Windows Phone 7 есть ListPicker, в котором свойства ItemsSource и SelectedIndex привязаны к моей ViewModel.SelectedIndex использует Двухстороннее связывание.Элементы и SelectedIndex правильно заполняются при запуске приложения.Однако, когда я изменяю свойство SelectedIndex в моей ViewModel, TextBox ListPicker's становится пустым, как если бы не было выбранного элемента.Если я перехожу в полный режим и проверяю, какой элемент выбран из списка, то выбирается правильный элемент.

Вот код xaml ListPicker:

<toolkit:ListPicker Name="TheListPicker" ItemsSource="{Binding TheItems}" CacheMode="BitmapCache" FullModeHeader="{Binding Path=Resources.TheHeader, Source={StaticResource LocalizedStrings }}" SelectedIndex="{Binding TheCurrentIndex, Mode=TwoWay}" IsEnabled="{Binding IsViewEnabled}" TabIndex="0" >
    <toolkit:ListPicker.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                <TextBlock Text="{Binding Name}" FontFamily="{StaticResource PhoneFontFamilySemiBold}" FontSize="{StaticResource PhoneFontSizeMediumLarge}" />
            </StackPanel>
        </DataTemplate>
    </toolkit:ListPicker.ItemTemplate>
    <toolkit:ListPicker.FullModeItemTemplate>
        <DataTemplate>
            <StackPanel x:Name="item" Orientation="Horizontal" Margin="5, 24, 0, 24">
                <TextBlock Margin="15, 0, 0, 0" Text="{Binding Name}" FontSize="40" TextWrapping="Wrap" />
            </StackPanel>
        </DataTemplate>
    </toolkit:ListPicker.FullModeItemTemplate>
</toolkit:ListPicker>

Это упрощенныйверсия моего ViewModel:

[DataMember]
public ObservableCollection<ItemEntity> TheItems
{
    get
    {
        if (this.theItems == null)
        {
            this.theItems = new ObservableCollection<ItemEntity>();
        }

        return this.theItems;
    }
    set
    {
        this.theItems = value;
    }
}

[DataMember]
public int TheCurrentIndex
{
    get 
    {
        return this.theCurrentIndex;
    }
    set
    {
        if (value != this.theCurrentIndex)
        {
            this.theCurrentIndex = value;
            NotifyPropertyChanged("TheCurrentIndex");
            NotifyPropertyChanged("IsSomeOtherPropertyEnabled");
        }
    }
}

А вот соответствующий код из MainPage.xaml.cs (App_ViewModelChanged - это обработчик событий, вызываемый при завершении некоторых асинхронных операций, выполняемых при запуске приложения):

private void App_ViewModelChanged(object sender, ViewModelChangedEventArgs e)
{    
    BindToViewModel();
}

private void BindToViewModel()
{
    this.DataContext = this.ViewModel;
    this.ViewModel.IsViewEnabled = true;
}

private void SomeAsyncMethodCompleted(object sender, DetectCompletedEventArgs e)
{
    if (e.Error == null)
    {
        this.ViewModel.TheCurrentIndex = e.Result;
    }
}

Эта проблема не происходит постоянно.Бывает как 50% времени.Похоже, что это происходит только один раз в жизни приложения, а затем никогда не повторяется.Кроме того, проблема начала появляться, когда я перешел с выпуска Silverlight Control Toolkit от февраля 2011 года на выпуск от августа 2011 года.Никогда раньше не было этой проблемы.

Это известная проблема?

1 Ответ

0 голосов
/ 06 октября 2011

Хорошо, поэтому причиной этого странного поведения было небольшое изменение стиля ListPickerItem в августе 2011 г. Silverlight Control Toolkit.

Вот так это выглядит в выпуске за август 2011 года:

<Style TargetType="controls:ListPickerItem">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="Padding" Value="8 10"/>
    <Setter Property="Template">
        <!-- More Stuff Here -->
    </Setter>
</Style>

А вот так это выглядело в выпуске за февраль 2011 года:

<Style TargetType="controls:ListPickerItem">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="Padding" Value="8 6"/>
    <Setter Property="Template">
        <!-- More Stuff Here -->
    </Setter>
</Style>

Видите разницу?Они изменили заполнение ListPickerItem на 8 10 в новом выпуске и каким-то образом это вызывало проблему.Возврат к 8 6 исправляет это.Не спрашивайте меня, почему.

Так что в моем проекте я фактически не модифицировал файл Generic.xaml набора инструментов управления, а просто изменил определенные ресурсы ListPicker, чтобы указать новый отступ для стиля ListPickerItem, например, так::

<toolkit:ListPicker Name="TheListPicker" ItemsSource="{Binding TheItems}" CacheMode="BitmapCache" FullModeHeader="{Binding Path=Resources.TheHeader, Source={StaticResource LocalizedStrings }}" SelectedIndex="{Binding TheCurrentIndex, Mode=TwoWay}" IsEnabled="{Binding IsViewEnabled}" TabIndex="0" >           
    <toolkit:ListPicker.Resources>
        <Style TargetType="toolkit:ListPickerItem">
            <Setter Property="Padding" Value="8 6"/>
        </Style>
    </toolkit:ListPicker.Resources>
    <toolkit:ListPicker.ItemTemplate>           
        <DataTemplate>           
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">           
                <TextBlock Text="{Binding Name}" FontFamily="{StaticResource PhoneFontFamilySemiBold}" FontSize="{StaticResource PhoneFontSizeMediumLarge}" />           
            </StackPanel>           
        </DataTemplate>           
    </toolkit:ListPicker.ItemTemplate>           
    <toolkit:ListPicker.FullModeItemTemplate>           
        <DataTemplate>           
            <StackPanel x:Name="item" Orientation="Horizontal" Margin="5, 24, 0, 24">           
                <TextBlock Margin="15, 0, 0, 0" Text="{Binding Name}" FontSize="40" TextWrapping="Wrap" />           
            </StackPanel>           
        </DataTemplate>           
    </toolkit:ListPicker.FullModeItemTemplate>           
</toolkit:ListPicker>

Такое маленькое изменение!

...