如何将Entry的值绑定到ViewModel.cs?

时间:2019-03-19 14:00:29

标签: c# xamarin xamarin.forms

嘿,我对Xamarin还是很陌生,我想从一个简单的方法开始,该方法有3个Entry,将在函数“ CalculateAv(Entry1,Entry2,Entry3)”中读取该函数,该函数计算3个输入数字的平均值。 不知何故,参数中的条目是未定义的,可能是因为绑定没有很好地完成。这里有一些代码: BasicButtonCommandPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:ButtonDemos;assembly=ButtonDemos"
             x:Class="ButtonDemos.BasicButtonCommandPage"
             Title="Basic Button Command">

    <ContentPage.BindingContext>
        <local:CommandDemoViewModel />
    </ContentPage.BindingContext>

    <ContentPage.Resources>
        <ResourceDictionary>
            <local:CommandDemoViewModel x:Key="model" />
            <local:DoubleToStringConverter x:Key="stringConverter" />
            <local:DoubleRoundingConverter x:Key="roundConverter" />
        </ResourceDictionary>
    </ContentPage.Resources>


    <StackLayout>
        <Label x:Name="Ausgabe" 
               Text="{Binding Number, StringFormat='Value is now {0}'}"
               FontSize="Large"
               VerticalOptions="CenterAndExpand" 
               HorizontalOptions="Center" />


        <Entry x:Name="Number1"
                Placeholder="Number1"
                Keyboard="Numeric"
                BindingContext="{x:Reference Rechner}" 
                Text="{Binding Path=CommanDemoViewModelProperty[modal].ErsteNummer}" />

        <Entry x:Name="Number2"
                Placeholder="Number2"
                Keyboard="Numeric"
                BindingContext="{x:Reference Rechner}"
                Text="{Binding Path=CommanDemoViewModelProperty[modal].ZweiteNummer}" />

        <Entry x:Name="Number3"
                Placeholder="Number3"
                Keyboard="Numeric"
                BindingContext="{x:Reference Rechner}"
                Text="{Binding Path=CommanDemoViewModelProperty[modal].DritteNummer}" />

        <Button x:Name="Rechner"
                Text="Multiply by 2"
                VerticalOptions="CenterAndExpand"
                HorizontalOptions="Center"
                Command="{Binding MultiplyBy2Command}" />
                <!--CommandParameter="{Binding Number1, Number2, Number3}" />-->


        <Button Text="Divide by 2"
                VerticalOptions="CenterAndExpand"
                HorizontalOptions="Center"
                Command="{Binding DivideBy2Command}" />
    </StackLayout>

</ContentPage>

此处是CommanDemoViewModel.cs

namespace ButtonDemos
{   

    class CommandDemoViewModel : INotifyPropertyChanged
    {

        double number = 2;
        double ersteNummer, zweiteNummer, dritteNummer;

        BindableProperty.Create()
        public event PropertyChangedEventHandler PropertyChanged;

        public double ErsteNummer
        {
            set
            {
                if (ersteNummer != value)
                {
                    ersteNummer = value;
                    OnPropertyChanged("ErsteNummer");
                }
            }
            get
            {
                return ersteNummer;
            }
        }
        public double ZweiteNummer
        {
            set
            {
                if (zweiteNummer != value)
                {
                    zweiteNummer = value;
                    OnPropertyChanged("ZweiteNummer");
                }
            }
            get
            {
                return zweiteNummer;
            }
        }
        public double DritteNummer
        {
            set
            {
                if (dritteNummer != value)
                {
                    dritteNummer = value;
                    OnPropertyChanged("DritteNummer");
                }
            }
            get
            {
                return dritteNummer;
            }
        }
        public double Number
        {
            set
            {
                if (number != value)
                {
                    number = value;
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Number"));
                }
            }
            get
            {
                return number;
            }
        }

        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        void CalculateAv(double ersteNummer, double zweiteNummer, double dritteNummer)
        {
            List<double> grades = new List<double> { ersteNummer, zweiteNummer, dritteNummer };
            Number = grades.Average();
        }
        public CommandDemoViewModel()
        {


            MultiplyBy2Command = new Command(

       execute: () => CalculateAv(ersteNummer, zweiteNummer, dritteNummer));




        DivideBy2Command = new Command(() => Number /= 2);  
        }

        public ICommand MultiplyBy2Command { private set; get; }

        public List<int> grades { get; set; }
        public ICommand DivideBy2Command { private set; get; }
        public string Path { get; set; }
    }
}

请不要对按钮的名称感到恼火,因为它是xamarin.forms中的示例。预先谢谢大家!

2 个答案:

答案 0 :(得分:1)

您的条目绑定不正确。

Number1应该显示如下

Text="{Binding ErsteNummer, Mode=TwoWay}" />

答案 1 :(得分:1)

是的,您的绑定错误,但是从MVVM开始时这很正常。

首先,我不确定您对ViewModel的实现。下载NuGet程序包Xamarin.Common.Mvvm,并从 BindableBase 继承您的ViewModel(或者只是找到一些功能,很容易找到)。

然后,在您的媒体资源上,将其更改为类似此媒体资源的内容:

private int _myNumber;
public int MyNumber { get => _myNumber; set => SetProperty(ref _myNumber, value); }

SetProperty 方法将从BindableBase继承,并将自动引发更改的属性。

现在,在您的XAML中,主要问题是您为条目设置了BindingContext两次:第一个在页面开头,第二个在条目中。您无法做到这一点,您的控件可能只有一个上下文,通常是页面上下文。因此,只需将ViewModel设置为页面的BindingContext,其他控件就会使用它。

之后,只需为以下内容设置条目的Text属性:

Text="{Binding MyNumber}"

从理论上讲,它现在应该可以正常工作。如有疑问,请问。