【问题标题】:Accessing XAML from code properly从代码中正确访问 XAML
【发布时间】:2016-06-02 13:02:00
【问题描述】:

我刚刚开始使用 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,但如果有一个简单的指南,它会很棒,它只显示如何将字符串绑定到标签,而无需数百行代码。请告诉我,我只是不擅长谷歌搜索,因为我花了很多时间试图弄清楚这一点。

【问题讨论】:

    标签: c# xamarin xamarin.forms


    【解决方案1】:

    您可以在这里使用两种方法:一种更简单但更丑陋,一种更复杂但更漂亮。

    直接编辑后面的代码

    (更简单,但由于高耦合而更丑)

    假设我们将有以下 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 阅读更多相关信息。

    我希望这会有所帮助!

    【讨论】:

    • 正要回答同样的问题+1
    • 谢谢!!!也许我应该提到我通常使用 Java,所以像字段支持属性(即使您在这里没有它们)和 event 关键字这样的概念对我来说不是很熟悉。完美的例子,再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多