2014-04-11 8 views
11

Per this page, DropDownButton używa ContextMenu do wyświetlenia ItemsSource. Skąd mamy wiedzieć, co użytkownik kliknie? Zdarzenie Click na przycisku nie dotyczy menu, ale sam przycisk. Nie widzę na tym żadnych innych wydarzeń.Jak sprawdzić, co zostanie kliknięte w DropDownButton

+0

Sprawdź następujące zdarzenia: 'DropDownOpened/DropDownClosed',' ContextMenuOpening/ContextMenuClosing'. –

+0

Nie używaj zdarzeń w WPF. Możliwe, że kontrola ma właściwość 'SelectedItem', lub możesz przypisać' Command's do każdego elementu, tak jak zrobiłbyś to w zwykłym 'Menu'. –

+0

@HighCore: The DropDownButton jest, cytuję: 'Ta kontrolka prawie taka sama jak SplitButton z kilkoma różnicami: Nie ma właściwości SelectedItem i SelectedIndex, a także nie ma zdarzenia SelectionChanged.'. –

Odpowiedz

0

Utwórz attached property na ContextMenu/DropDownButton (cokolwiek wolisz). Jeśli wyświetliłeś menu rozwijane, a następnie uzyskaj menu kontekstowe, które się wyświetla, podłącz je i przytwierdź z powrotem do właściwości.

3

Można zastąpić szablonu elementu do sterowania i można dodać obsługi wewnątrz niego tak:

<controls:DropDownButton Content="Select me" x:Name="selectMeDropDownButton"> 
    <controls:DropDownButton.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding}" MouseDown="selectMeDropDownButton_TextBlock_MouseDown" /> 
     </DataTemplate> 
    </controls:DropDownButton.ItemTemplate> 
</controls:DropDownButton> 

i wdrożenie obsługi zdarzeń w pliku kodu tak:

void selectMeDropDownButton_TextBlock_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    if (e.ChangedButton == MouseButton.Left && this.selectMeDropDownButton.IsExpanded) 
    { 
     var value = ((TextBlock)e.Source).DataContext; 
     // Do something meaningful with the value, it's an item from ItemsSource 
    } 
} 

Konieczne jest sprawdzenie dla DropDownButton.IsExpanded, ponieważ ten sam ItemTemplate jest stosowany do na samym przycisku. Oczywiście możesz zastąpić TextBlock dowolną wersją Control/UIElement.

+0

IMO lepiej używać '' zamiast '' w ''. – xmedeko

14

Natrafiłem na to pytanie szukając tej samej odpowiedzi. Nigdy tak naprawdę nic nie znalazłem online, ale odkryłem to rozwiązanie samodzielnie. Być może pomoże to komuś w przyszłości.

Jak już wcześniej wspomniano, DropDownButton używa ContextMenu, aby wyświetlić jego ItemsSource. Zasadniczo to, czego szukałem, to menu "jak-podobne" z przycisku. Na przykład powiedzmy, że masz DropDownButton z napisem "Dodaj". Może chcesz 2 opcje, takie jak "Dodaj nowy" i "Dodaj istniejący". Więc to właśnie zrobiłem ...

Najpierw zrobiłem obiekt do przechowywania nagłówka/treści i polecenia.

public class TitledCommand 
{ 
    public String Title { get; set; } 
    public ICommand Command { get; set; } 
} 

Teoretycznie to masz listę tych do wiązania się z ItemsSource na DropDownButton.

public List<TitledCommand> TitledCommmands { get; private set; } 

Teraz tylko styl pojemnik produktu za DropDownButton więc podnosi nagłówek i polecenia od naszych obiektów w ItemsSource.

Dołącz MahApps:

xmlns:metroControls="http://metro.mahapps.com/winfx/xaml/controls" 

A oto styl ...

<metroControls:DropDownButton Content="Add" ItemsSource="{Binding Path=TitledCommmands}"> 
    <metroControls:DropDownButton.ItemContainerStyle>   
     <Style TargetType="MenuItem"> 
      <Setter Property="Header" Value="{Binding Path=Title}"/> 
      <Setter Property="Command" Value="{Binding Path=Command}"/> 
     </Style>   
    </metroControls:DropDownButton.ItemContainerStyle> 
</metroControls:DropDownButton> 
+1

W moim przypadku użycie '' nie działało, a atrybut DisplayMemberPath był lepszy, ale i tak jesteś ratownikiem;) – kwesolowski

+1

Ten powinien być zaakceptowany odpowiedź. –

+0

Ładnie zrobione! thx – petric

-1

Wpisz SplitButton zamiast DropDownButton. Pierwsza ma zdarzenie SelectionChanged.

+2

Tak, ale nie mają tego samego odczucia po kliknięciu ... – petric

Powiązane problemy