Xamarin Forms绑定-截取绑定值并进行更改

时间:2019-06-19 14:20:07

标签: xamarin xamarin.forms freshmvvm

我有一个简单的组合式自定义控件,该控件显示设置为绑定的ControlText属性的文本。在下面的示例中,您可以看到单击按钮时控件已更新。

enter image description here

如何更改代码,以使控件显示的标签接收发送给它的所有内容并将其转换为全部大写字母?

所以没有显示...

Count = 5

它将显示...

COUNT = 5

在这个简单的示例中,可以利用 IValueConverter 来完成此操作,但是我想为需要实现的更为复杂的示例提供不同的实现。我正在寻找一种解决方案,该解决方案可以拦截在后面的代码中设置的值,然后将其转换并将其设置为自定义控件的ControlText属性。

SimpleControl.xaml.cs

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class SimpleControl : ContentView
{
    public SimpleControl ()
    {
        InitializeComponent ();
    }

    public static readonly BindableProperty ControlTextProperty = BindableProperty.Create(
                                           propertyName: nameof(ControlText),
                                           returnType: typeof(string),
                                           declaringType: typeof(SimpleControl),
                                           defaultBindingMode: BindingMode.TwoWay,
                                           defaultValue: "Hello World");

    public string ControlText
    {
        get { return (string)base.GetValue(ControlTextProperty); }
        set { base.SetValue(ControlTextProperty, value); }
    }
}

此外,我希望在运行时遇到此断点,但是代码永远不会在其上停止。我正在从SimplePageModel设置属性,所以我感到奇怪,这个问题从未被实现。有人也可以向我解释吗?

enter image description here

SimpleControl.xaml

<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="App7.SimpleControl"
             x:Name="this">
    <ContentView.Content>
        <StackLayout Margin="100">
            <Label Text="{Binding Source={x:Reference this}, Path=ControlText}" />
        </StackLayout>
    </ContentView.Content>
</ContentView>

SimplePage.xaml

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:App7"
             x:Class="App7.SimplePage">
    <ContentPage.Content>
        <StackLayout>
            <local:SimpleControl ControlText="{Binding ControlText}" />

            <Button Text="Update Control"
                Command="{Binding UpdateControl}" />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

SimplePageModel.cs(利用FreshMVVM)

public class SimplePageModel : FreshBasePageModel
{
    public SimplePageModel() { }

    private int _index;

    public string ControlText { get; set; }

    public Command UpdateControl
    {
        get
        {
            return new Command((t) =>
            {
                ControlText = $"Count = {++_index}";
            });
        }
    }

    public override void Init(object initData)
    {
        ControlText = $"Count = 0";

        base.Init(initData);
    }
}

1 个答案:

答案 0 :(得分:0)

您也可以为此使用触发器,因为它不太清楚背景是什么,我只是建议它可以有所帮助: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/triggers