Связывание ICommand в представлении содержимого форм Xamarin - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть пользовательский вид, который будет использоваться на многих страницах. У меня есть кнопка «Закрыть» в пользовательском представлении, где мне нужно связать команду CloseButton в моей MainViewModel. Любая помощь будет принята.

Вот мой файл HeaderView.xaml.cs

public partial class HeaderView : ContentView
{
    public HeaderView ()
    {
        InitializeComponent ();
    }
    public static readonly BindableProperty CloseButtonClickedProperty = BindableProperty.Create(nameof(CloseButtonClick), typeof(ICommand), typeof(HeaderView), null);
    public ICommand CloseButtonClick
    {
        get => (ICommand)GetValue(CloseButtonClickedProperty);
        set => SetValue(CloseButtonClickedProperty, value);
    }

}

Вот мой код кнопки закрытия, используемый в файле HeaderView.Xaml

<?xml version="1.0" encoding="UTF-8" ?>
<ContentView
    HeightRequest="65"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="NameSpace.Views.HeaderView" x:Name="headerView">
            <Image  x:Name="CloseButton" Source="ic_closewhite.png" WidthRequest="20" HeightRequest="20" VerticalOptions="CenterAndExpand"  HorizontalOptions="EndAndExpand">
                <Image.GestureRecognizers>
                    <TapGestureRecognizer Command="{Binding CloseButtonClick, Source={x:Reference headerView}}"  />
                </Image.GestureRecognizers>
            </Image>
</ContentView>

Здесь я пытаюсь использовать команду в своем файле MainView.xaml.

<c:HeaderView CloseButtonClick ="{Binding CloseButtonClickCommand}"/>

Но выдается ошибка: enter image description here

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Вы делаете правильно, но отсутствует только одна маленькая вещь, это x: Имя ContentView HeaderView. Просто включите эту строку кода в Xaml HeaderView.

x:Name="headerView"

Вот ваш модифицированный Xaml: -

<?xml version="1.0" encoding="UTF-8" ?>
<ContentView
    HeightRequest="65"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Name="headerView"
    x:Class="NameSpace.Views.HeaderView" x:Name="headerView">
            <Image  x:Name="CloseButton" Source="ic_closewhite.png" WidthRequest="20" HeightRequest="20" VerticalOptions="CenterAndExpand"  HorizontalOptions="EndAndExpand">
                <Image.GestureRecognizers>
                    <TapGestureRecognizer Command="{Binding CloseButtonClick, Source={x:Reference headerView}}"  />
                </Image.GestureRecognizers>
            </Image>
</ContentView>
0 голосов
/ 05 ноября 2019
public static readonly BindableProperty CloseButtonClickedProperty = BindableProperty.Create(nameof(CloseButtonClick), typeof(ICommand), typeof(HeaderView), null);

проблема в этой строке, как говорится в сообщении об ошибке,

событие найдено для 'CloseButtonClick' или несоответствие типа между значением и свойством

вы должны изменить CloseButtonClickedProperty на CloseButtonClickProperty.

public static readonly BindableProperty CloseButtonClickedProperty = BindableProperty.Create(nameof(CloseButtonClick), typeof(ICommand), typeof(HeaderView), null);
public ICommand CloseButtonClick
{
    get => (ICommand)GetValue(CloseButtonClickedProperty);
    set => SetValue(CloseButtonClickedProperty, value);
}

на

public static readonly BindableProperty CloseButtonClickProperty = BindableProperty.Create(nameof(CloseButtonClick), typeof(ICommand), typeof(HeaderView), null);
public ICommand CloseButtonClick
{
    get => (ICommand)GetValue(CloseButtonClickProperty);
    set => SetValue(CloseButtonClickProperty, value);
}
...