2013-04-19 4 views
1

Есть ли способ связать выделенный элемент ComboBox в WPF/MVVM?WPF MVVM - привязка выделенного элемента в Combobox

Причина, по которой я хочу, чтобы это поведение состояло в том, что я хочу щелкнуть правой кнопкой мыши элемент ComboBox и передать аргумент (идентификатор элемента) в CommandParameter.

Поскольку ни один элемент не выбран на самом деле, пока я не щелкнуть левой кнопкой мыши по этому вопросу, у меня нет никаких арг, чтобы пройти ...

Мысли пожалуйста?

<ComboBox.ContextMenu> 
<ContextMenu> 
<MenuItem Header="Delete Expense Category" Command="{Binding DeleteMenuItemCommand}" 
CommandTarget="{Binding HighlightedExpenseCategory}" CommandParameter="{Binding Id}"></MenuItem> 
</ContextMenu> 
</ComboBox.ContextMenu> 
+1

Если вы хотите, чтобы щелкнуть правой кнопкой мыши ComboBoxItem, почему бы не поставить ContextMenu в ComboBoxItem вместо ComboBox? –

+0

действительная точка, но у меня нет ComboBoxItems, поскольку она привязана к ItemSource. Извините, я должен был упомянуть об этом в моем вопросе. Это то, что вы имели ввиду? – Salty

+3

Затем поставьте это как часть ComboBox 'ItemContainerStyle'. –

ответ

2

Прежде всего, вопрос: какова ваша конечная цель, и можете ли вы приблизиться к ней, не щелкнув правой кнопкой мыши по контекстному пункту меню? Возможно, вам может понадобиться иерархическая combobox, как на картинке здесь Any ideas how to implement ComboBox to represent hierarchical data?. Хотя это может вас не устраивать, если вы действительно хотите выполнить действие над элементом в своем поле со списком.

С этим в сторону, HighCore поставил вас на правильный трек (извините HighCore, я собираюсь украсть немного вашего грома здесь, но в качестве утешения я даю вам пару голосов). Главное, что ContextMenu является свойством ComboBoxItem, а не самой ComboBox.

Этот фрагмент кода может помочь вам приблизиться, хотя я не тестировал его за пределами XamlPad. Вероятно, у вас будет дополнительный шаг, чтобы убедиться, что ваши привязки могут достичь вашей модели представления с помощью команды, а также свойства Id вашего элемента меню, где бы вы ни определили это. Попробуйте RelativeSource Binding, но вернитесь, если вам нужна помощь. Удачи!

<ComboBox> 
    <ComboBox.Resources> 
      <ContextMenu x:Key="contextMenu"> 
      <MenuItem Header="Delete Expense Category" Command="{Binding DeleteMenuItemCommand}" 
       CommandTarget="{Binding HighlightedExpenseCategory}" CommandParameter="{Binding Id}" /> 
      </ContextMenu> 
    </ComboBox.Resources> 

    <ComboBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ComboBoxItem}"> 
     <Style.Setters> 
      <Setter Property="ContextMenu" Value="{StaticResource contextMenu}" /> 
     </Style.Setters> 
     </Style> 
    </ComboBox.ItemContainerStyle> 
    <ComboBoxItem Content="1" /> 
    <ComboBoxItem Content="2" /> 
</ComboBox> 
+0

спасибо за фрагмент ... ваш первый вопрос заставил меня думать, может быть, я не должен идти «правым кликом», так как приложение имеет 3 редактируемые comboboxes, и это может быть неприятно для пользователя, если ему нужно было щелкнуть правой кнопкой мыши в трех разных местах. я думаю, что сконцентрировать данные из этих comboboxes в окне «предпочтения» будет более понятным UI-мудрый. в соответствии с моим первоначальным вопросом, который я продолжал копать, и похоже, что у mvvm light toolbox есть решения, предлагаемые. – Salty

Смежные вопросы