2013-04-13 15 views
9

Próbuję powiązać właściwość IsSelected obiektu ListViewItem z właściwością ViewModel. Działa dobrze w WPF, ale w systemie Windows RT właściwość IsSelected nigdy nie jest ustawiana.ListViewItem IsSelected Binding - działa dla WPF, ale nie dla 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> 

jestem w stanie przejrzeć elementów na ekranie, ale nie jest własność IsSelected rozmnożeniowego ViewModel. Jakieś pomysły, dlaczego?

Odpowiedz

3

WinRT nie obsługuje wiązań w ustawieniach w ogóle od wersji Windows 8.0. Bing dla obejść.

+0

mógłbyś podać link? Naprawdę nie wiem, czego szukać. –

+0

Zobacz moją odpowiedź na to pytanie: http://stackoverflow.com/questions/11857505/how-do-i-do-bindings-in-itemcontainerstyle-in-winrt –

+0

Używam rozszerzeń WinRT Xaml Toolkit. Działa poprawnie. Dzięki – vivekp

3

Dobrym i łatwym sposobem na to jest do podklasy ListView

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); 
     } 
    } 

Alternatywnie, wydaje się, można również zrobić z 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> 

Osobiście zastosowałem pierwsze podejście, ponieważ jest ono bardziej elastyczne i musiałem powiązać kilka właściwości automatyzacji.

kuponów do ForInfo i 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

Używam rozszerzeń WinRT Xaml Toolkit. Działa poprawnie. Dzięki – vivekp

+0

Zestaw narzędzi Xaml wydaje się działać tylko dla mnie, nawet z Mode = TwoWay. Jeśli zaznaczę coś w ListView, to nie upituje ViewModel? –

Powiązane problemy