2016-10-12 3 views
0

listview 항목의 선택된 상태를 모델의 부울 속성에 바인딩하는 가장 쉬운 방법은 무엇입니까?UWP listview binding

나는이 모델 :

class Model { 
    public string Name { get; set; } 
    public bool Selected { get; set; } 
} 

그리고 목록보기 :

myListView.ItemsSource = // list of Model instances 

내가 모델의 Selected 속성을 원하는 : 나는이 목록보기 항목을 결합

<ListView x:Name="myListView" SelectionMode="Multiple"> 
<ListView.ItemTemplate> 
    <DataTemplate x:DataType="x:String"> 
     <TextBlock Text="{Binding Name}"/> 
    </DataTemplate> 
</ListView.ItemTemplate> 

언제나 다시 myListView에서 선택되었는지 여부를 확인하십시오. 따라서 myListView에서 항목을 선택/선택 취소하면 적절한 bool 값을 유지하거나 Selected 속성을 설정하여 myListView가 해당 항목을 선택/선택 취소합니다.

+0

: 그래서 내 생각은 여기에 단지 예를 들어, 뒤에 코드에서이 속성을 결합하는 것입니다 // stackoverflow.com/a/2511836/60761). UWP에서 작동하는지 여부를 알려주십시오. –

+0

감사합니다. 그러나, 정확히 그 대답에서 코드를 붙여 넣을 정확히 모르겠습니다. ListView 태그 사이에 붙여 넣었습니다. 그런 다음 오류가 발생합니다. 유형이 Windows 유니버설 프로젝트에서 지원되지 않으며 구성원 IsSelected가 인식되지 않거나 액세스 할 수 없습니다. –

답변

0

나는 완벽한 방법은 ListView.ItemSelectionChanged 이벤트를 구현하고 목록보기 모델의 각 항목을 반복하여 선택한 항목에 대해 true로 설정하고 나머지 항목에는 false로 설정하는 것이라고 생각합니다.

class Model { 
    public string Name { get; set; } 
    public bool Selected 
    { 
     get 
     { 
      return MyListView.SelectedItems.Count(x => x.Name == Name) > 0; 
     } 
    } 
} 
+0

데이터 모델에서 'MyListView'를 어떻게 찾을 수 있습니까? –

1

what is the easiest way to bind selected state of listview's item to model's boolean property?

잘 모르겠어요이 가장 쉬운 경우 :이 올바른 방법 인 경우

그러나, 당신은 솔직히 잘 모르겠어요하지만, 이런 식으로 뭔가를 시도 할 수 있습니다 그런데 제게는 SelectorItem.IsSelected propertyListViewItem 인 것을 모델의 Selected 속성에 바인딩하는 가장 쉬운 방법이라고 생각합니다. 문제는 단지 ListView의 각 항목이 ListViewItem의 인스턴스라는 것을 알고 있지만 DataTemplate을 사용하여 ListViewItem의 항목 구조를 만들 때 디자인 타임에는 ListViewItem을 사용할 수 없습니다. 뒤에

<ListView x:Name="myListView" SelectionMode="Multiple" Loaded="myListView_Loaded" ItemsSource="{x:Bind Collection}"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}" /> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

코드 : 난 당신이 [이 응답 (HTTP를 사용 할 수 있어야한다고 생각

private ObservableCollection<Model> Collection = new ObservableCollection<Model>(); 

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    for (int i = 0; i < 100; i++) 
    { 
     Collection.Add(new Model { Name = "Name " + i }); 
    } 
} 

private void myListView_Loaded(object sender, RoutedEventArgs e) 
{ 
    IEnumerable<ListViewItem> lvItems = FindVisualChildren<ListViewItem>(myListView); 
    if (lvItems != null) 
    { 
     foreach (ListViewItem lvitem in lvItems) 
     { 
      Model model = lvitem.Content as Model; 
      Binding b = new Binding 
      { 
       Source = model, 
       Path = new PropertyPath("Selected"), 
       Mode = BindingMode.TwoWay, 
      }; 
      BindingOperations.SetBinding(lvitem, ListViewItem.IsSelectedProperty, b); 
     } 
    } 
} 

private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
{ 
    if (depObj != null) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
      if (child != null && child is T) 
      { 
       yield return (T)child; 
      } 

      foreach (T childOfChild in FindVisualChildren<T>(child)) 
      { 
       yield return childOfChild; 
      } 
     } 
    } 
} 

public class Model : INotifyPropertyChanged 
{ 
    public string Name { get; set; } 

    private bool _Selected; 

    public bool Selected 
    { 
     get { return _Selected; } 
     set 
     { 
      if (value != _Selected) 
      { 
       _Selected = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged([CallerMemberName]string propertyName = "") 
    { 
     if (this.PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

잘 작동합니다. 감사합니다! 그러나 IsSelectedProperty에 대한 Selected 속성의 바인딩을 수행하는 C# 코드를 XAML로 변환하는 방법이 있습니까? 더 읽기 쉽습니다. –

+0

코드에 문제가 있습니다 - myListView에 visibility == collapsed가 있습니다. seriesListView_Loaded가 호출되어 (나중에 myListView가 표시됨) 바인딩이 설정되지 않습니다. –

+0

@MartinDusek, 내가 말한 것처럼이 시나리오의 ListViewItem은 xaml에서 사용할 수 없습니다. 그래서 xaml 코드에서 바인딩 할 수 없습니다. 이 메서드는 다른 [ListView의 이벤트]에 넣을 수 있습니다 (https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.listview.aspx?f=255&MSPPError=- 2147217396 # events),하지만이 코드를 보이게하려면이 코드를 실행하는 것이 좋습니다. 나는 그것이 큰 문제가 아니라고 생각한다. –