2013-04-13 5 views
9

Ich versuche, die IsSelected-Eigenschaft eines ListViewItem an eine Eigenschaft in einem ViewModel zu binden. Es funktioniert gut in WPF, aber in Windows RT wird die IsSelected-Eigenschaft nie festgelegt.ListViewItem IsSelected Binding - Funktioniert für WPF, aber nicht für 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> 

Ich bin in der Lage auf die Elemente auf dem Bildschirm klicken, aber die IsSelected Eigenschaft ist nicht auf das Ansichtsmodell propagieren. Irgendwelche Ideen warum?

Antwort

3

WinRT unterstützt keine Bindungen in Setter überhaupt ab Windows 8.0. Bing für Problemumgehungen.

+0

könnten Sie einen Link? Ich weiß nicht wirklich, wonach ich suchen soll. –

+0

Siehe meine Antwort auf diese Frage: http://stackoverflow.com/questions/11857505/how-do-i-do-bindings-in-itemcontainerstyle-in-winrt –

+0

Ich verwende WinRT Xaml Toolkit-Erweiterungen. Es funktioniert einwandfrei. Danke – vivekp

3

Eine gute und einfache Möglichkeit, dies zu tun ist, 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); 
     } 
    } 

Alternativ Unterklasse, es scheint, dass Sie es auch mit WinRT XAML Toolkit tun können.

Persönlich habe ich den ersten Ansatz verwendet, weil es flexibler ist und ich ein paar Automatisierungseigenschaften binden musste.

Credits ForInfo und 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

Ich benutze WinRT Xaml Toolkit Erweiterungen. Es funktioniert einwandfrei. Danke – vivekp

+0

Das Xaml Toolkit scheint nur für mich zu funktionieren, sogar mit Mode = TwoWay. Wenn ich etwas in der ListView wähle, wird das ViewModel nicht aktualisiert. –

Verwandte Themen