从代码正确访问 XAML

why*_*ent 0 c# xamarin xamarin.forms

我刚刚开始使用 Xamarin.Forms,我没有找到任何文档来指定我如何操作代码中标签中的文本之类的内容。我只有一个带有标签、加号按钮和减号按钮的应用程序。加号应该增加标签中的值,减号应该做相反的事情。

我的视图是在 XAML 中定义的。当我查看https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/data_binding_basics/ 时,我并没有真正找到与此匹配的内容。我想我应该创建一个表示数字的“NumberViewModel”,然后使用一些 PropertyChanged-isch 系统将数据绑定到视图。

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

我将调整到 Xamarin.Forms,但如果有一个简单的指南会很棒,它只展示了如何将字符串绑定到标签,而无需数百行代码。请告诉我,我只是不擅长谷歌搜索,因为我花了很多时间试图弄清楚这一点。

Mar*_*coK 5

您可以使用两种方法:更简单但更丑的一种,以及稍微复杂但更漂亮的一种。

直接编辑后面的代码

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

假设我们将有以下 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>
Run Code Online (Sandbox Code Playgroud)

您可以像这样(简化)直接在后面的代码中引用 UI:

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

btnMinus.Clicked += delegate {
    currentValue--;
    lblOutput.Text = currentValue.ToString ();
};
Run Code Online (Sandbox Code Playgroud)

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

使用 MVVM 方法

(更复杂,但更灵活)

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

this.BindingContext = new ViewModel ();
Run Code Online (Sandbox Code Playgroud)

现在我们可以有一个这样的 XAML:

<StackLayout Orientation="Vertical">
    <Label Text="{Binding CurrentValue}" />
    <StackLayout Orientation="Horizontal">
        <Button Text="+" Command="{Binding AddCommand}" />
        <Button Text="-" Command="{Binding MinusCommand}" />
    </StackLayout>
</StackLayout>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

您可以在此处此处阅读有关它的更多信息。

我希望这有帮助!