2016-10-12 4 views
0

リストビューのアイテムの選択状態をモデルのブール値プロパティにバインドする最も簡単な方法は何ですか?UWPリストビューバインディング

私が持っているモデル:

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

私はあなたが[この回答](HTTPを使用することができるはずだと思いますstackoverflow.com/a/2511836/60761)。それがUWPのために働くかどうかを/私たちに知らせるためにポストバックしてください。 –

+0

ありがとうございます。しかし、私はその答えからどこにコードを貼り付けるべきか正確には分かりません。私はListViewタグの間に貼り付けました。次に、エラーが発生します。タイプはWindowsユニバーサルプロジェクトでサポートされていません。メンバーIsSelectedは認識されないか、アクセスできません。 –

答えて

0

私は完璧な方法はListView.ItemSelectionChangedイベントを実装し、リストビューモデルの各アイテムを反復して、選択されたアイテムに対して真に設定し、残りのアイテムに対しては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> 

コード://:

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

これはうまくいきます、ありがとう!しかし、SelectedプロパティのIsSelectedPropertyへのバインドを実行するC#コードをXAMLに直接変換する方法があります。これは読みやすくなります。 –

+0

コードに問題があります。myListViewには、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)、私はそれを見えるようにしたいときにこのコードを実行する方が良いと思います。私はそれが大きな問題ではないと思う。 –