2011-07-19 71 views
1

我正在尋找一種在Silverlight中每次顯示一個項目集合的好方法,而不顯示用於選擇項目的UI。這就像沒有選項卡的TabControl,或者沒有下拉選項的組合框。Silverlight ItemsControl一次顯示一個項目?

現在我們正在使用TabControl樣式來隱藏標籤,但感覺就像是黑客。 Silverlight中有更自然的方法嗎?

下面是我在尋找的特徵:

  • 僅顯示選定的項目。
  • 不要顯示用於選擇項目的UI。 (選擇將根據用戶在應用UI的不同部分中的操作而改變。)
  • 數據綁定到視圖模型的集合。
  • 使用DataTemplate顯示每個視圖模型的視圖。
  • 保留每個選定項目的視圖狀態。 (例如,假設在我們的一次一個項目控件中,我們顯示了選定項目的選項樹,我希望爲每個項目分別跟蹤樹節點的展開/摺疊狀態。)

我剛剛使用綁定到所選項目的ContentPresenter嘗試:

<ContentPresenter Content="{Binding SelectedItem}"> 
    <ContentPresenter.ContentTemplate> 
    <DataTemplate> 
     <MyUserControl /> 
    </DataTemplate> 
    </ContentPresenter.ContentTemplate> 
</ContentPresenter> 

但這似乎使用的MyUserControl的單個實例,重新綁定同一個實例,以不同的ViewModels爲的SelectedItem變化。這意味着狀態,例如是否擴展樹節點,不會根據選定的項目單獨跟蹤。


有沒有更好的方法來做到這一點?

感謝您的幫助,
理查德

回答

1

這很容易做到。

第一步是使用ListBox,提供datatemplate,viewmodel集合並綁定選定的項目,就像您已經在做的一樣。

你想要的步驟(隱藏所有未選擇的項目)僅僅需要你創建一個ItemContainerStyle。這種風格有一個你想要關注的VisualStateGroup,有兩個狀態「Selected」和「Unselected」。在Unselected狀態下,您希望將LayoutRoot設置爲摺疊狀態,而在Selected中,您希望LayoutRoot可見。

如果你有Blend,這將需要大約15分鐘。

+0

謝謝!我將首先嚐試這種方法。我有Blend,但是我對Blend的瞭解只能擴展到複製控件模板。我會嘗試一下 :)。 –

2

做到這一點,最好的辦法需要一些少數工作:

創建延伸System.Windows.Controls.Primitives.Selector一類是基礎類具有對象:

  • 集合勢必
  • 一則selectedItem

您將Grid設置爲ItemsPanel,並將ItemTemplate設置爲填充整個網格但默認隱藏(或不透明)的DataTemplate。 IsSelected Property的DataTemplate中的觸發器隱藏/顯示Item。

僅僅是一種可能性

+0

謝謝!這聽起來也是一個很好的解決方案。我會看看定製ItemsPanel並使用觸發器。 –

1

是否有一個原因,你必須能夠訪問到控制本身的SelectedItem屬性格式?如果您可以移動處理所選項目的邏輯(例如取消選擇,返回選擇哪個項目等)到視圖模型,那麼您可以只使用帶有網格的ItemsControl作爲ItemsPanel。然後在ItemTemplate中可以放入MyUserControl。 MyUserControl將其可見性屬性綁定到數據項上的一個屬性,其間有一個轉換器。然後,您將在數據項而不是UI控件上將IsSelected設置爲true,並顯示MyUserControl的相應實例。

+0

謝謝!不,我實際上不需要訪問控件上的SelectedItem屬性。在上面的代碼片段中,我綁定了一個屬性「SelectedItem」,但這是一個視圖模型屬性。我會考慮綁定Visibility屬性。 –

相關問題