2013-04-13 5 views
9

ListViewItemのIsSelectedプロパティをViewModelのプロパティにバインドしようとしています。 WPFでは正常に動作しますが、Windows RTではIsSelectedプロパティが決して設定されません。ListViewItem IsSelectedバインディング - WPFでは動作しますがWinRTでは動作しません

public class Item : INotifyPropertyChanged 
{ 
    private readonly string name; 
    private bool isSelected; 
    public event PropertyChangedEventHandler PropertyChanged; 

    public bool IsSelected 
    { 
     get { return isSelected; } 
     set { isSelected = value; RaisePropertyChanged("IsSelected"); } 
    } 

    public string Name { get { return name; } } 

    public Item(string name) 
    { 
     this.name = name; 
    } 

    protected void RaisePropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

public class ViewModel 
{ 
    private readonly ObservableCollection<Item> items = new ObservableCollection<Item>(Enumerable.Range(0, 10).Select(p => new Item(p.ToString()))); 
    public ObservableCollection<Item> Items { get { return items; } } 
} 

public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
     DataContext = new ViewModel(); 
    } 
} 

XAML:

<StackPanel Orientation="Horizontal"> 
    <ListView ItemsSource="{Binding Path=Items}" SelectionMode="Multiple"> 
     <ListView.ItemContainerStyle> 
      <Style TargetType="ListViewItem"> 
       <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/> 
      </Style> 
     </ListView.ItemContainerStyle> 
    </ListView> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=Name}"/> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</StackPanel> 

私は、画面上の項目をクリックすることだけど、IsSelectedプロパティがViewModelにに伝播されていません。なぜどんなアイデア?

答えて

3

WinRTは、Windows 8.0以降のセッターでのバインディングをまったくサポートしていません。回避策のためのBing。

+0

は、あなたがリンクを提供してもらえますか?私は本当に何を探したらいいのか分からない。 –

+0

この質問に対する私の答えを見てください:http://stackoverflow.com/questions/11857505/how-do-i-do-bindings-in-itemcontainerstyle-in-winrt –

+0

私はWinRT Xaml Toolkitの拡張機能を使用しています。それは適切に動作します。ありがとう – vivekp

3

これを行うには良いと簡単な方法は、リストビューに

public class MyListView : ListView 
    { 
     protected override void PrepareContainerForItemOverride(Windows.UI.Xaml.DependencyObject element, object item) 
     { 
      base.PrepareContainerForItemOverride(element, item); 
      // ... 
      ListViewItem listItem = element as ListViewItem; 
      Binding binding = new Binding(); 
      binding.Mode = BindingMode.TwoWay; 
      binding.Source = item; 
      binding.Path = new PropertyPath("Selected"); 
      listItem.SetBinding(ListViewItem.IsSelectedProperty, binding); 
     } 
    } 

またをサブクラス化することで、あなたにもWinRT XAML Toolkitでそれを行うことができそうです。

<ListView 
      x:Name="lv" 
      Grid.Row="1" 
      Grid.Column="1" 
      SelectionMode="Multiple" 
      HorizontalAlignment="Left" 
      Width="500"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <TextBlock 
         Extensions:ListViewItemExtensions.IsSelected="{Binding IsSelected}" 
         Extensions:ListViewItemExtensions.IsEnabled="{Binding IsEnabled}" 
         Text="{Binding Text}" 
         Margin="15,5" 
         FontSize="36" /> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 

個人的には、柔軟性が高く、いくつかの自動化プロパティをバインドする必要があったため、私は最初の方法を使用しました。 ForInfoとehunaへ

クレジット: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/9a0adf35-fdad-4419-9a34-a9dac052a2e3/listviewitemisselected-data-binding-in-style-setter-is-not-working

+0

私はWinRT Xaml Toolkit拡張を使用しています。それは適切に動作します。ありがとう – vivekp

+0

Xamlツールキットは、Mode = TwoWayの場合でも、私のためだけに作業しているようです。 ListViewで何かを選択すると、ViewModelをアップさせませんか? –

関連する問題