2013-06-19 59 views
2

在WinRT App(C#)中,我有List<Item> items,它綁定到ListBox
Class Item有2個欄位:string Namebool IsSelected。如你所知,我想將IsSelected字段綁定到ListBoxItem的IsSelected屬性。
在ListBox中以多種選擇模式綁定ListBoxItem的IsSelected屬性

爲什麼我需要這個?爲什麼我沒有使用我的ListBoxSelectedItems財產?

  1. 在剛裝入ListBox,我已經有一些項目,它必須是IsSelected = true
  2. 我不想再創建一個集合來存儲所有選定的項目。

我在找什麼?
我在尋找完美的解決方案,就像在WPF:

<ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
    <Setter Property="IsSelected" Value="{Binding IsSelected}"/> 
    </Style> 
</ListBox.ItemContainerStyle> 

但我們都知道,WinRT中不支持綁定的setter方法在所有。

我還要檢查nice postFilip Skakun博客 - 這是一個解決方案,但我需要我自己寫的一些BindingBuilder/BindingHelper的。

而現在,我知道解決我的問題雙向的:

  1. 綁定的ListBoxSelectedItems財產和存放物品的另一個集合。 - 我不喜歡這種方式
  2. 做它像Filip Skakun - 如果我找不到我使用這個。

在理想的情況下,我想爲此使用原生解決方案,或者也許有人已經爲我的情況編寫/測試了嵌套BindingBuilder - 這也會有幫助。

回答

2

如何創建一個列表框得出:

public class MyListBox : ListBox 
{ 
    protected override void PrepareContainerForItemOverride(
     DependencyObject element, object item) 
    { 
     base.PrepareContainerForItemOverride(element, item); 

     if (item is Item) 
     { 
      var binding = new Binding 
      { 
       Source = item, 
       Path = new PropertyPath("IsSelected"), 
       Mode = BindingMode.TwoWay 
      }; 

      ((ListBoxItem)element).SetBinding(ListBoxItem.IsSelectedProperty, binding); 
     } 
    } 
} 
+0

出色答卷。謝謝。 – jimpanzer

+0

由於'Item'是'ListBox'上的ItemSource屬性的類型,因此可以刪除if語句以使控件更通用。其實我不確定爲什麼那張支票就在那裏。在我看來,檢查'element'是否是一個'ListBoxItem'會更有意義。 – Trisped

+0

@Trisped呃,沒有。 「ItemsSource」屬性的類型是「object」(或WPF中的「IEnumerable」)。您通常會分配一個仍然可以包含任何類型的集合,而不僅僅是應用程序定義的「Item」類。另一方面,在ListBox中,元素類型始終是'ListBoxItem',除非您也重寫'GetContainerForItemOverride'並返回其他類型。我建議開始閱讀這裏:[WPF ItemsControl](http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.aspx)。 – Clemens

相關問題