0

我开发了一个简单的两行自定义控件来托管名称-值对并使用可重用的逻辑显示它。我可以使用设置两个标签值的两个 BindableProperty 来设置两个属性和 XAML 之间的链接。

这是我的自定义控件 XAML:

<?xml version="1.0" encoding="UTF-8"?>
<StackLayout
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="SystemOne.ui.GenericItem"
    Orientation="Vertical">
    <Label x:Name="TitleLabel" />
    <Label x:Name="ContentLabel"/>
</StackLayout>

这是后面代码中的属性和相关的 BindableProperty 之一:

public string TextContent { get; set; }
public static readonly BindableProperty TextContentProperty = BindableProperty.Create(
    propertyName: "TextContent",
    returnType: typeof(string),
    declaringType: typeof(GenericItem),
    defaultValue: "",
    propertyChanged: TextContentPropertyChanged);
private static void TextContentPropertyChanged(BindableObject bindable, object oldValue, object newValue)
    {
        GenericItem GenericItem = (GenericItem)bindable;
        GenericItem.ContentLabel.Text = newValue.ToString();
    }

这允许以这种方式在任何页面中使用 GenericItem 自定义控件(定义适当的命名空间):

<ui:GenericItem x:Name="MyGenItem" TextContent="{Binding MyViewModel.MyContentText}" />

GenericItem 自定义控件从为 TextContent 属性定义的绑定中获取其 Lable 'ContentLabel' 的值。

现在我想开发一些允许使用这个伪 XAML 的东西:

<ui:GenericItem x:Name="MyGenItem" TextContent="{Binding MyViewModel.MyContentText}" Clicked="{Binding MyViewModel.SomeProperty}"/>

甚至不绑定:

<ui:GenericItem x:Name="MyGenItem" TextContent="{Binding MyViewModel.MyContentText}" Clicked="MyGenericItem_Tapped"/>

其中“MyGenericItem_Tapped”是在页面的代码隐藏中定义的事件处理程序方法,它正在创建 GeneriItem 控件的“MyGenItem”实例。

我找不到办法!

4

1 回答 1

0

我使用 ContentView 制作自定义控件,如下所示:

<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="App17.GenericItem">
<ContentView.Content>
    <StackLayout Orientation="Vertical">
        <Label x:Name="TitleLabel"  />
        <Label x:Name="ContentLabel"  />
    </StackLayout>
</ContentView.Content>
 </ContentView>

然后使用GestureRecognizers直接而不是使用 Bindable 属性的触摸事件侦听器。

   <ui:GenericItem x:Name="MyGenItem" TextContent="{Binding MyContentText}">
            <ui:GenericItem.GestureRecognizers>
                <TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped"></TapGestureRecognizer>
            </ui:GenericItem.GestureRecognizers>
        </ui:GenericItem>

如果你想使用绑定GestureRecognizers,你可以使用 ICommand。

xml:

  <ui:GenericItem x:Name="MyGenItem" TextContent="{Binding MyContentText}">
            <ui:GenericItem.GestureRecognizers>
                <TapGestureRecognizer Command="{Binding TapGestureRecognizer_Command}"></TapGestureRecognizer> 
            </ui:GenericItem.GestureRecognizers>
        </ui:GenericItem>

后面的代码:

public partial class Page14 : ContentPage
{
    public Page14()
    {
        InitializeComponent();
        this.BindingContext = new MyViewModel();
    }       
}
public class MyViewModel
{
    public Command TapGestureRecognizer_Command { get; set; }
    public string MyContentText { get; set; }
    public MyViewModel()
    {
        MyContentText = "Hello";
        TapGestureRecognizer_Command = new Command(TappedCommand);
    }

    private void TappedCommand(object obj)
    {
        Console.WriteLine("TappedCommand");
    }
}
于 2021-12-13T06:44:26.050 回答