Caliburn Micro с WPF MouseBinding

Я хотел бы зафиксировать щелчок мыши на WPF <Rectangle> и направить его в реализацию команды с помощью Caliburn Micro. Вот разметка:

<Rectangle ... >
    <Rectangle.InputBindings>
        <MouseBinding Gesture="LeftClick" />
    </Rectangle.InputBindings>
</Rectangle>

Какой синтаксис Caliburn Micro мне нужно добавить к элементу <MouseBinding>, чтобы я мог перенаправить клик на мою модель представления?


person JeffFerguson    schedule 22.11.2011    source источник
comment
Разве вы не можете просто привязать Command к свойству команды в вашей виртуальной машине?   -  person H.B.    schedule 23.11.2011
comment
Что ж, в Caliburn Micro нет такой вещи, как ICommand. Его философия заключается в том, что ICommand не нужен. Я ищу, могу ли я найти решение, которое остается в рамках общей философии Caliburn Micro.   -  person JeffFerguson    schedule 23.11.2011
comment
Я не могу придумать ни одной веской причины, по которой кто-то мог бы это сделать. Какие причины приведены?   -  person H.B.    schedule 23.11.2011


Ответы (3)


Вы можете использовать стандартный элемент управления Button и изменить шаблон элемента управления для отображения прямоугольника:

<Button x:Name="Submit">
    <Button.Template>
        <ControlTemplate>
            <Rectangle ... />
        </ControlTemplate>
    </Button.Template>
</Button>
person devdigital    schedule 22.11.2011

Я написал небольшое расширение разметки, которое ведет себя очень похоже на действия Caliburn.Micro. Он вызывает метод модели представления. Этот пример поддерживает только методы без параметров, но его можно легко расширить.

Использование:

    <Border.InputBindings>
        <MouseBinding Command="{ns:CallViemodelMethod SomeMethod}" MouseAction="LeftClick" />
    </Border.InputBindings>

Посмотреть модель:

public class SomeViewModel 
{
    publiv void SomeMethod()
    {
        // handle click
    }
}

Расширение:

public class CallViemodelMethod : MarkupExtension, ICommand
{
    private readonly string _methodName;
    private FrameworkElement _rootObject;

    public CallViemodelMethod(string methodName)
    {
        _methodName = methodName;
    }

    public event EventHandler CanExecuteChanged;

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        // get root of target page
        var provideRoot = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
        _rootObject = provideRoot?.RootObject as FrameworkElement;
        return this;
    }

    public bool CanExecute(object parameter) => true;

    public void Execute(object parameter)
    {
        var dataContext = _rootObject?.DataContext;
        if (dataContext == null) return;

        var methodInfo = dataContext.GetType().GetMethod(_methodName);
        if (methodInfo == null) return;

        methodInfo.Invoke(dataContext, new object[0]);
    }
}
person tom.maruska    schedule 25.01.2017

Одна вещь, которую вы можете сделать, чтобы получить LeftClick, - это просто дать имя прямоугольнику и создать метод с тем же именем в модели представления: это реальная сила caliburn micro, которая является соглашением по конфигурации, т.е. соглашениями об именах, соединяющими представление и модель представления, команда и ответ и так далее...

xaml выглядит так

<Rectangle x:Name="Rectangle" >
</Rectangle>

и модель просмотра выглядит так

 public void Rectangle()
 { 
        // your code goes here
 }
person Shigil P V    schedule 05.04.2017