2014-04-12 62 views
0

我在我的項目中使用了多個列表而不是樹 - 用於正確的虛擬化(樹結構中的很多項目)。 這些列表幾乎相同。唯一的區別在於DataTemplates。這些列表有一些事件綁定,我必須在幾個地方複製&更新。當前事件被用於:從ListBox繼承

  • 防止水平自動滾動
  • 支持箭頭鍵通過樹狀結構導航

我發現沒有辦法將事件綁定在一個單一的風格在資源字典,因爲事件必須屬於特定的類。所以我必須在類之間複製完全相同的事件並將它們綁定到特定的列表。這在XAML和代碼中都是相當多的文字。

我想要做的是定義一個新的用戶控件,從standart ListBox中派生所有東西,但是覆蓋一些小方法(而不是事件)。並且在需要這樣的列表的任何地方重複使用這種控制,而不必複製所有事件。

問題是 - 它需要我定義自定義< UserControl .../>。有沒有一種方法可以在那裏使用ListBox模板/樣式?我不需要從標準ListBox進行GUI修改。

我可能會錯過一些簡單的方法來執行我想要的。我會很感激任何方式來做到這一點。

回答

0

不確定您的設置,但您可能必須重寫ListBox和ListBoxItem。然後覆蓋一些方法:

public partial class MyListBox: ListBox 
{ 

    protected override System.Windows.DependencyObject GetContainerForItemOverride() 
    { 
     return new MyListBoxItem(); 
    } 

    protected override bool IsItemItsOwnContainerOverride(object item) 
    { 
     return item is MyListBoxItem; 
    } 
} 

public class MyListBoxItem : ListBoxItem 
{ 

} 

這將強制您的容器爲ListBoxItem覆蓋。

現在你只需要在ListBoxItem覆蓋中實現你特定的代碼。如果您不需要任何樣式更改,則將應用默認的ListBox樣式。現在

您可以在XAML中使用它:在代碼

<local:MyListBox ItemsSource="{Binding Items}"> 
    <local:MyListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding id}"/> 
     </DataTemplate> 
    </local:MyListBox.ItemTemplate> 
</local:MyListBox> 
+0

類繼承是沒有問題的。問題是我不能使用這個重寫類,而沒有爲它定義XAML UserControl。 Visual Studio告訴我這樣的類在WPF中不可用。嘗試將MyList放到你的窗口上。 – user2274578

+0

我剛剛測試過它,它都正常工作。你能從VisualStudio發佈精確的錯誤信息嗎? – Dmitry

+0

奇怪的是,在我的項目中嘗試了這個 - 並沒有奏效。在空白項目中嘗試了同樣的事情 - 它的構建很好。感謝幫助!對不起,愚蠢的錯誤。 – user2274578