Команда MVVM без кнопки - PullRequest
       25

Команда MVVM без кнопки

2 голосов
/ 14 октября 2010

Я хочу инициировать связанную команду, но я не хочу использовать Button на моем UserControl. По сути, UserControl само по себе Button. Когда он щелкает в любом месте на его поверхности, я хочу инициировать связанную команду. Есть ли способ дать UserControl команду?

В примечании: одна команда для одного элемента управления и только несколько определенных встроенных элементов управления? Это все кажется немного неуклюжим. Я начинаю думать, что MVVM нецелесообразен. Я могу отлично отделить свой интерфейс с помощью интерфейсов и ООП. Во всяком случае, у меня все еще есть надежда.

Кроме того, я не хочу ничего взламывать или использовать дорогостоящий обходной путь. Если я не могу этого сделать, я отказываюсь от MVVM.

Ответы [ 5 ]

4 голосов
/ 14 октября 2010

Взгляните на интерфейс ICommandSource здесь: http://msdn.microsoft.com/en-us/library/system.windows.input.icommandsource.aspx. Если вы хотите, чтобы элемент управления имел команду, тогда ваш элемент управления должен реализовать этот интерфейс.Примерами элементов управления, которые реализуют этот интерфейс, являются ButtonBase и MenuItem.Надеюсь, это поможет.

4 голосов
/ 14 октября 2010

Если ваш UserControl по сути является Button, почему вы пишете свой собственный UserControl вместо использования класса Button?

Чтобы добавить больше информации, вот что вы делаете:

  1. Кнопка подкласса, поместите туда любые дополнительные DependencyProperties, которые вам нужны - это должен быть очень пустой класс (у вас может быть даже что-то вроде public class MyCoolButton : Button { }
  2. Добавить стиль с TargetType MyCoolButton - не называйтестиль, так что он применяется ко всем MyCoolButtons
  3. Переопределите шаблон стиля по умолчанию, а затем вставьте свой код Xaml. Возможно, вам придется проделать некоторую работу здесь, чтобы обработать состояния «Нормальный / Толкаемый / Отключенный». Есливы используете v4.0, вы можете использовать VSM здесь.
1 голос
/ 14 октября 2010

ОП запросил пример того, как вы можете использовать элемент управления кнопки, но с содержимым, правильно заполняющим всю кнопку.Вы можете сделать это, используя свойства ContentAlignment:

<Button HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
    <Button.Content>
        <Grid IsHitTestVisible="False">
            <Grid.RowDefinitions>
                <RowDefinition Height="30" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <TextBlock Grid.Row="0" Text="Row0" />
            <TextBlock Grid.Row="1" Text="Row1" />
        </Grid>
    </Button.Content>
</Button>

Это создаст кнопку с двумя метками, разнесенными с использованием элемента управления Grid.Я отмечаю Grid, чтобы отключить HitTestVisible, так как вы должны решить, какие элементы управления должны взаимодействовать как кнопка, а какие должны взаимодействовать как элементы управления.Например, у вас может быть встроенный TextBox, который вы хотите щелкать, не нажимая кнопку, и в этом случае он должен иметь HitTestVisible = True.

1 голос
/ 14 октября 2010

Я согласен с Полом Беттсом.

Довольно часто я создаю свой собственный ListBoxItemContainerStyle, используя кнопку в качестве верхнего контейнера, в котором нет ничего, кроме предъявителя контента без свойств.Это позволяет мне использовать функциональность кнопок (например, Command) без использования Windows Chrome.

Помещение в ListBoxItemContainerStyle также позволяет мне сделать так, чтобы при нажатии на него не отображалась обычная пунктирная граница(FocusVisualStyle = {x: Null}).

Используете ли вы Visual Studio или Expression Blend для создания стиля?

Кроме того, некоторые инфраструктуры MVVM предоставляют интерфейс для добавления возможности команды ishк элементам управления, кроме кнопок.Caliburn имеет довольно богатый командный паттерн.Однако я не уверен, разрешает ли он привязывать команды к элементам управления, не являющимся кнопками.

0 голосов
/ 14 октября 2010

WPF поддерживает слои и прозрачность:

Panel.ZIndex

Вы можете создать все, что поддерживает командование на превосходном прозрачном слое нужного размера, чтобы действовать как кнопка.

...