2013-04-13 25 views
9

Tôi đang cố gắng liên kết thuộc tính IsSelected của một ListViewItem với thuộc tính trong một ViewModel. Nó hoạt động tốt trong WPF, nhưng trong Windows RT thuộc tính IsSelected không bao giờ được thiết lập.ListViewItem IsSelected Binding - Làm việc cho WPF, nhưng không phải cho 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> 

Tôi có thể nhấp vào các mục trên màn hình, nhưng tài sản IsSelected không tuyên truyền đến ViewModel. Bất kỳ ý tưởng tại sao?

Trả lời

3

WinRT không hỗ trợ các ràng buộc trong các trình cài đặt ở tất cả từ Windows 8.0. Bing cho cách giải quyết.

+0

Ông có thể cung cấp một liên kết? Tôi không thực sự biết những gì để tìm kiếm. –

+0

Xem câu trả lời của tôi cho câu hỏi này: http://stackoverflow.com/questions/11857505/how-do-i-do-bindings-in-itemcontainerstyle-in-winrt –

+0

Tôi đang sử dụng phần mở rộng Bộ công cụ WinRT Xaml. Nó hoạt động đúng. Cảm ơn – vivekp

3

Một cách tốt và dễ dàng để làm điều này là để phân lớp 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); 
     } 
    } 

Ngoài ra, có vẻ như bạn cũng có thể làm điều đó với 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> 

Cá nhân, tôi đã sử dụng phương pháp đầu tiên vì linh hoạt hơn và tôi cần ràng buộc một vài Thuộc tính tự động hóa.

Tín dụng cho ForInfo và 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

Tôi đang sử dụng phần mở rộng Bộ công cụ WinRT Xaml. Nó hoạt động đúng. Cảm ơn – vivekp

+0

Bộ công cụ Xaml dường như chỉ hoạt động trên đường, ngay cả với Chế độ = HaiWay. Nếu tôi chọn một cái gì đó trong ListView, nó không nâng cấp ViewModel? –

Các vấn đề liên quan