正确访问代码中的XAML

时间:2016-06-02 13:02:00

标签: c# xamarin xamarin.forms

我刚刚开始使用Xamarin.Forms并且我找不到任何文档来指定我如何操作像代码中的Label中的文本。我只有一个带有Label,加号按钮和减号按钮的应用程序。加上应该增加标签中的值,减去应该相反。

我的观点在XAML中定义。当我看https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/data_binding_basics/时,我真的找不到与此相符的东西。我想我应该创建一个代表数字的“NumberViewModel”,然后使用一些PropertyChanged-isch系统将数据绑定到视图。

如果这是Android,那么我将在xml中定义我的按钮,其中包含将处理按钮单击的方法的预期名称(我在Xamarin.Forms中也这样做)。然后单击按钮,然后触发代码中的方法,在触发的方法中,我可能会通过调用findViewById(....)来检索我想要操作的对象。

我将调整为Xamarin.Forms但是它会很好用一个简单的指南,只显示如何将字符串绑定到标签,没有数百行代码。请告诉我,我只是在谷歌搜索不好,因为我花了很多时间试图解决这个问题。

1 个答案:

答案 0 :(得分:4)

你可以在这里找到两种方法:更容易,但更丑陋,更复杂,但更漂亮。

直接编辑

背后的代码

(更容易,但由于高耦合而更加丑陋)

假设我们有以下XAML:

<StackLayout Orientation="Vertical">
    <Label x:Name="lblOutput" Text="[output]" />
    <StackLayout Orientation="Horizontal">
        <Button x:Name="btnAdd" Text="+" />
        <Button x:Name="btnMinus" Text="-" />
    </StackLayout>
</StackLayout>

您可以直接在后面的代码中引用UI,如此(简化):

int currentValue = 0;
lblOutput.Text = currentValue.ToString ();
btnAdd.Clicked += delegate {
    currentValue++;
    lblOutput.Text = currentValue.ToString ();
};

btnMinus.Clicked += delegate {
    currentValue--;
    lblOutput.Text = currentValue.ToString ();
};

这里的诀窍是使用x:Name,允许您直接使用后面代码中的元素。

使用MVVM方法

(更复杂,但更灵活)

创建一个新类(您的ViewModel)并实现INotifyPropertyChanged接口。将该类绑定到后面的XAML代码中的视图,如下所示:

this.BindingContext = new ViewModel ();

现在我们可以像这样使用XAML:

<StackLayout Orientation="Vertical">
    <Label Text="{Binding CurrentValue}" />
    <StackLayout Orientation="Horizontal">
        <Button Text="+" Command="{Binding AddCommand}" />
        <Button Text="-" Command="{Binding MinusCommand}" />
    </StackLayout>
</StackLayout>

并且ViewModel看起来像这样:

public ICommand AddCommand { get; private set; }
public ICommand MinusCommand { get; private set; }

public ViewModel ()
{
    AddCommand = new Command (() => {
        CurrentValue = CurrentValue+1;
    });

    MinusCommand = new Command (() => {
        CurrentValue = CurrentValue-1;
    });
}

public int CurrentValue { get; set; } // You'll need to handle the PropertyChanged events here

您可以详细了解herehere

我希望这有帮助!