2014-02-20 1 views
0

WP8에서 LongListSelector를 정말 싫어하고 툴킷 버전이 훨씬 더 좋다고 말해야합니다.WP8의 LongListSelector에서 선택된 행을 선택 해제하는 방법

먼저이 코드는 MVVM과 호환되지 않으므로이 코드를 찾아서 찾았습니다.

public class LongListSelector : Microsoft.Phone.Controls.LongListSelector 
    { 
     public LongListSelector() 
     { 
      SelectionChanged += LongListSelector_SelectionChanged; 
     } 

     void LongListSelector_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      SelectedItem = base.SelectedItem; 
     } 

     public static readonly DependencyProperty SelectedItemProperty = 
      DependencyProperty.Register(
       "SelectedItem", 
       typeof(object), 
       typeof(LongListSelector), 
       new PropertyMetadata(null, OnSelectedItemChanged) 
      ); 

     private static void OnSelectedItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      var selector = (LongListSelector)d; 
      selector.SelectedItem = e.NewValue; 
     } 

     public new object SelectedItem 
     { 
      get { return GetValue(SelectedItemProperty); } 
      set { SetValue(SelectedItemProperty, value); } 
     } 
    } 

은 내가 빛 MVVM을 사용하여 뷰 모델을 만든 후 그때 모델

public class Test : ObservableObject 
    { 
     public string Name { get; set; } 
    } 

을 만든 내가 클릭하면 내가 XAML

<phone:PhoneApplicationPage 
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
          xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 
          xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
          xmlns:ignore="http://www.ignore.com" 
          xmlns:local="clr-namespace:MvvmLight2" x:Class="MvvmLight2.MainPage" 
          mc:Ignorable="d ignore" 
          FontFamily="{StaticResource PhoneFontFamilyNormal}" 
          FontSize="{StaticResource PhoneFontSizeNormal}" 
          Foreground="{StaticResource PhoneForegroundBrush}" 
          SupportedOrientations="Portrait" 
          Orientation="Portrait" 
          shell:SystemTray.IsVisible="True" 
          DataContext="{Binding Main, Source={StaticResource Locator}}"> 

    <!--LayoutRoot is the root grid where all page content is placed--> 
    <Grid x:Name="LayoutRoot" 
     Background="Transparent"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <local:LongListSelector ItemsSource="{Binding MyList}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"> 
      <local:LongListSelector.Resources> 
       <DataTemplate x:Key="ItemTemplate"> 
        <Grid> 
         <TextBlock Text="{Binding Name}" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="48"/> 
        </Grid> 
       </DataTemplate> 
      </local:LongListSelector.Resources> 
      <local:LongListSelector.ItemTemplate> 
       <StaticResource ResourceKey="ItemTemplate"/> 
      </local:LongListSelector.ItemTemplate> 
     </local:LongListSelector> 
     <Button Content="Unselect" HorizontalAlignment="Left" Margin="142,81,0,0" Grid.Row="1" VerticalAlignment="Top" Command="{Binding ButtonCmd, Mode=OneWay}"/> 
    </Grid> 

</phone:PhoneApplicationPage> 

했다

public class MainViewModel : ViewModelBase 
    { 

     public MainViewModel() 
     { 
      MyList = new ObservableCollection<Test> 
      { 
       new Test 
       { 
        Name = "test 1" 
       }, 
       new Test 
       { 
        Name = "test 2" 
       } 
      }; 

      ButtonCmd = new RelayCommand(() => Hit()); 
     } 

     private void Hit() 
     { 
      SelectedItem = null; 
     } 

     public ObservableCollection<Test> MyList { get; set; } 

     /// <summary> 
     /// The <see cref="SelectedItem" /> property's name. 
     /// </summary> 
     public const string SelectedItemPropertyName = "SelectedItem"; 

     private Test selectedItem = null; 

     /// <summary> 
     /// Sets and gets the SelectedItem property. 
     /// Changes to that property's value raise the PropertyChanged event. 
     /// </summary> 
     public Test SelectedItem 
     { 
      get 
      { 
       return selectedItem; 
      } 

      set 
      { 
       if (value != null) 
       { 
        MessageBox.Show(value.Name); 
       } 


       if (selectedItem == value) 
       { 
        return; 
       } 

       RaisePropertyChanging(() => SelectedItem); 
       selectedItem = value; 
       RaisePropertyChanged(() => SelectedItem); 
      } 
     } 


     public RelayCommand ButtonCmd 
     { 
      get; 
      private set; 
     } 

목록의 첫 번째 항목에서 메시지 상자가 나타나면 다시 쳐도 아무 일도 일어나지 않습니다. 그런 다음 selectedItem (이전 툴킷 버전에서는 충분 함)을 null로 설정하고 다시 시도하고 아무 일도 일어나지 않는 내 버튼을 누르십시오.

모든 첫 번째 행을 선택할 수있는 유일한 방법은 목록에 하나의 항목 만 주어진 시간이 있다고 말할 경우 실제로 두 번째 행을 선택하는 것입니다.

이상한 점은 문자열의 단순한 컬렉션은 항상 SelectItem을 null로 설정해야 할 필요가 없다는 것입니다. 항상 선택하지 않는 것처럼 보이지만 복잡하지 않은 유형은 올 때가 아닙니다. 나는 동일한 코드를 사용하고 똑같은 문제로 실행했습니다

void LongListSelector_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      if((sender as LongListSelector).SelectedItem == null){ 

      return; 
      } 

      SelectedItem = base.SelectedItem; 
      (sender as LongListSelector).SelectedItem = null; 
     } 
+0

ButtonCmd 코드를 보는 것이 유용 할 것입니다. 변경 이벤트가 발생하지 않는 유일한 방법은 감지 된 변경 사항이없는 경우입니다. – lsuarez

+0

모든 코드가 게시됩니다. ButotnCmd는 SelectedItem을 null로 설정하는 Hit() 메소드를 트리거합니다. – chobo2

답변

0

. 그 이유는 SelectedItem 속성이 base.SelectedItem 속성을 능가한다는 것입니다. 새 값으로 설정하는 경우뿐만 아니라 당신의 selectedItem 속성 그러나뿐만 아니라 기본 하나를 설정 : 다음

public new object SelectedItem 
    { 
     get { return GetValue(SelectedItemProperty); } 
     set 
     { 
      SetValue(SelectedItemProperty, value); 
      base.SelectedItem = value; 
     } 
    } 

당신은 MVVM 수있는 코드를 가지고으로 설정하여 (뿐만 아니라 당신의 ViewModel에서의 selectedItem를 재설정 할 수 있습니다 없는).

+0

흠,이 코드는 앱을 중단합니다. 내가 생각하기 때문에 목록을 아무것도 선택로드됩니다, 내가 null을 확인하려고 할 때 무언가를 선택하려고 설정할 것입니다. – chobo2

+0

@ chobo2 왜 그 선택 항목을 저장하고 싶습니까? – techloverr

+0

@Romasz 그가 질문에 제안한대로 null로 만들기 전에 넣은 것입니다. – techloverr

1

에서 selectionChanged 이벤트에 쉽게를 통해 달성 할 수

관련 문제