0

을 수정할 때 나는 모두 ItemsSourceselectedIndex의 속성이 내 뷰 모델에 바인딩 내 윈도우 폰 7 앱에서 ListPicker이 비어 간다. SelectedIndex는 양방향 바인딩을 사용하고 있습니다. 항목 및 SelectedIndex는 응용 프로그램 시작시 올바르게 채워집니다. 그러나, 내 ViewModel에서 SelectedIndex 속성을 수정할 때 ListPicker의 TextBox는 선택한 항목이없는 것처럼 비어있게됩니다. 전체 모드로 이동하여 목록에서 선택된 항목이 맞는지 확인하면 올바른 항목이 선택됩니다.데이터 바인딩 ListPicker의 selectedItem는 selectedIndex의

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

이 내 뷰 모델의 단순화 된 버전입니다 : 여기

[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가있다가 여기

는 ListPicker의 XAML 코드 응용 프로그램 시작시 수행 된 비동기 작업이 완료되면 호출되는 이벤트 핸들러) :

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 %가 발생합니다. 응용 프로그램 수명에서 한 번만 발생하고 다시는 발생하지 않습니다. 또한 2011 년 2 월 Silverlight Control Toolkit 릴리스를 2011 년 8 월 릴리스로 전환했을 때 문제가 발생하기 시작했습니다. 전에는이 문제가 없었습니다.

이 것이 알려진 문제입니까?

+0

대신 SelectedItem을 사용 하시겠습니까? –

+0

SelectedItem을 사용할 때 이와 같은 문제가 해결 될 것이라는 희망으로 SelectedIndex를 사용하기 시작했습니다. 따라서 어느 것을 사용 하느냐가 중요하지 않습니다. –

+0

일부 코드를 우리와 공유 할 수 있습니까? 아마도이 문제를 해결하는 데 도움이 될 수 있습니다. – BigL

답변

0

이 이상한 동작의 이유는 2011 년 8 월 Silverlight Control Toolkit의 ListPickerItem 스타일이 약간 변경된 것이 었습니다.

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

그리고 이것은이 2 월 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> 

차이를보기를

이는 8 월 2011 버전을 보는 방법인가? 그들은 새 릴리스에서 ListPickerItem Padding을 으로 변경했는데 어떻게 든 그 문제를 일으켰습니다. 으로 되 돌리면 해결됩니다. 왜 나 한테 묻지 마.

그래서 실제로 제어 툴킷 generic.xaml을 파일을 수정하지만, 그냥이처럼 ListPickerItem 스타일에 대한 새로운 패딩을 지정하는 특정 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.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> 

이러한 작은 변화!