Реализация INotifyPropertyChanged в моем проекте Xamarin - PullRequest
0 голосов
/ 30 октября 2019

поэтому у меня есть класс модели, который я назвал «Объектами», и я хочу создать ViewModel, чтобы я мог отслеживать изменения, которые происходят в одном из аргументов класса модели, который называется «nbr_objet». что я должен делать ? это то, что я сделал до сих пор, и, пожалуйста, исправьте меня.

Модель класса:


public class Objets
    {
    public string Designation { get; set; }
    public string Description { get; set; }
    public float Prix { get; set; }
    public int nbr_objet { get; set; }
    public Objets(string Designation, string Description, float Prix, int nbr_objet)
    {
        this.Designation = Designation;
        this.Description = Description;
        this.Prix = Prix;
        this.nbr_objet= nbr_objet;
    }
    }

ModelViewBase, где у меня проблема, очевидно,


class ViewModelBase : INotifyPropertyChanged
    {
    public Objets ObjetVM { get; set; }
    public int nbr_objet 
    {
        get { return ObjetVM.nbr_objet; }
        set
        {
            ObjetVM.nbr_objet = value;
            OnPropertyChanged(nameof(ObjetVM.nbr_objet));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyname)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname));
    }
}

И этомой MainPage.xaml.cs, где я создал несколько «Объектов»


    public MenuPage()
    {
        InitializeComponent();
        this.BindingContext = new ViewModelBase();
    }

Ответы [ 3 ]

1 голос
/ 30 октября 2019

Вот скриншот.

enter image description here

Вы можете добиться этого, как следующий формат в вашем model.

 public  class MyObjets : INotifyPropertyChanged
{
   // public string Designation { get; set; }
  //  public string Description { get; set; }
 //   public float Prix { get; set; }
 //   public int nbr_objet { get; set; }


    int _nbr_objet;
    public int Nbr_objet
    {
        get
        {
            return _nbr_objet;
        }

        set
        {
            if (_nbr_objet != value)
            {
                _nbr_objet = value;
                OnPropertyChanged("Nbr_objet");

            }
        }

    }

    float _prix;
    public float Prix
    {
        get
        {
            return _prix;
        }

        set
        {
            if (_prix != value)
            {
                _prix = value;
                OnPropertyChanged("Prix");

            }
        }

    }

    string _designation;
    public string Designation
    {
        get
        {
            return _designation;
        }

        set
        {
            if (_designation != value)
            {
                _designation = value;
                OnPropertyChanged("Designation");

            }
        }

    }

    string _description;
    public string Description
    {
        get
        {
            return _description;
        }

        set
        {
            if (_description != value)
            {
                _description = value;
                OnPropertyChanged("Description");

            }
        }

    }


    public MyObjets(string Designation, string Description, float Prix, int nbr_objet)
    {
        this._designation = Designation;
        this._description = Description;
        this._prix = Prix;
        this._nbr_objet = nbr_objet;
    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
  }
 }

Тогда вот макет.

   <StackLayout>
    <!-- Place new controls here -->
    <Label Text="{Binding Designation}" 
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand" />
    <Label Text="{Binding Description}" 
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand" />
    <Label Text="{Binding Prix}" 
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand" />
    <Label Text="{Binding Nbr_objet}" 
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand" />
  </StackLayout>

Вот код бэкенда макета.

  public MainPage()
    {
        InitializeComponent();
        BindingContext = new MyObjets("xxxx","cccc",1.22f,11);
    }

Вот мое демо о MVVM с Listview, вы также можете обратиться к нему. https://github.com/851265601/MVVMListview

Если ответ полезен, не забудьте пометить его как ответ.

====================== Обновление ========================

Вы хотите добиться результата, подобного следующему GIF? enter image description here

Вот ваша модель

  public  class MyObjets 
{
    public string Designation { get; set; }
    public string Description { get; set; }
    public float Prix { get; set; }
    public int nbr_objet { get; set; }

    public MyObjets(string Designation, string Description, float Prix, int nbr_objet)
    {
        this.Designation = Designation;
        this.Description = Description;
        this.Prix = Prix;
        this.nbr_objet = nbr_objet;
    }

}

Вот ViewModelBase

 public class ViewModelBase: INotifyPropertyChanged
{
    public ViewModelBase()
    {

        ObjetVM = new MyObjets("ccc","xxx",1.2f,123);
    }
public MyObjets ObjetVM { get; set; }
    public int nbr_objet
    {
        get { return ObjetVM.nbr_objet; }
        set
        {
            ObjetVM.nbr_objet = value;
            OnPropertyChanged(nameof(ObjetVM.nbr_objet));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged(string propertyname)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname));
}

}

Здеськод раскладки.

 <StackLayout>

    <Label Text="{Binding nbr_objet}" 
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand" />

    <Button Text="change the value" Clicked="Button_Clicked"></Button>
</StackLayout>

вот код раскладки фона.

   public partial class MainPage : ContentPage
{
    ViewModelBase viewModelBase;
    public MainPage()
    {
        InitializeComponent();


        viewModelBase =  new ViewModelBase();
        BindingContext = viewModelBase;
    }

    private void Button_Clicked(object sender, EventArgs e)
    {
        viewModelBase.nbr_objet = 111;
    }
}
0 голосов
/ 30 октября 2019

Когда вы изменяете свойство "nbr_objet", вы сообщаете, что ваше свойство внутри ObjetVM изменилось, но это не ваш bindingContext - ваш bindingContext является ViewModelBase.

Так что лучше переписать его:

private int nbr_object;

public int Nbr_objet_property
{
    get { return nbr_objet; }
    set
    {
        nbr_objet = value;
        OnPropertyChanged(nameof(Nbr_objet_property));
    }
}

И затем каждый раз, когда вы изменяете "Nbr_objet_property", он должен обновлять то, к чему вы его привязали.

Кроме того, "ObjetVM" не является моделью представления, поскольку он не реализует логику INotifyPropertyChanged.

Надеюсь, это имеет смысл? :)

0 голосов
/ 30 октября 2019

Вам необходимо реализовать INotifyPropertyChanged для любого объекта, на котором вы хотите отслеживать изменения. Прямо сейчас вы отслеживаете только изменения в модели представления, поэтому вам также необходимо добавить INotifyPropertyChanged в класс Objets, а также каждое свойство в классе с помощью методов getters / setters с OnPropertyChanged, как вы это делали в модели представления.

public class Objets: INotifyPropertyChanged
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...