Я не понимаю, связывание? - PullRequest
       0

Я не понимаю, связывание?

0 голосов
/ 17 января 2020

Я в последнее время возился с MVVM в C# и дошел до того, что мне показалось, что я понял, как работают привязки, но потом это случилось ...

using System;
using System.Collections.Generic;
using System.Text;

namespace API
{
    public class ApiViewModel : BaseViewModel
    {
        public bool CustomerIsChecked { get; set; }

        public bool StorageIsChecked { get; set; }

        public bool ArticlesIsChecked { get; set; }


        public bool Transfer()
        {
            if(CustomerIsChecked == true)
            {
                return true; 
            }
            return false;
        }
        public override string ToString()
        {
            return Transfer().ToString(); 
        }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using PropertyChanged; 

namespace API
{
    [AddINotifyPropertyChangedInterface]
    public class BaseViewModel : INotifyPropertyChanged
    {

        public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };

    }
}

Это работает, если мне просто нравится отправить строку или что-либо еще в привязку напрямую, но когда я пытаюсь отправить значение переноса, оно не работает, оно дает мне пустую кнопку, почему это? Мой вопрос заключается в том, почему это не работает в основном, когда вы используете строку без каких-либо параметров или чего-то еще, а просто используете метод получения или установки, он работает, но для отправки строки, у которой этого нет? Почему это?

1 Ответ

0 голосов
/ 17 января 2020

Вы должны удалить () за методом Transfer:

public class ApiViewModel : BaseViewModel
{
    public bool CustomerIsChecked { get; set; }

    public bool StorageIsChecked { get; set; }

    public bool ArticlesIsChecked { get; set; }


    public bool Transfer  // <- remove ()
    {
        get   // it should have a getter.
        {
            if(CustomerIsChecked == true)
            {
                return true; 
            }
            return false;
        }
    }
    public override string ToString()
    {
        return Transfer().ToString(); 
    }
}

Код Transfer может быть упрощен. Он должен возвращать истину, когда CustomerIsChecked истинно, иначе ложно.

Итак:

public bool Transfer
{
    get => CustomerIsChecked;
}

Мой старый ответ (я не понял вопроса)

Вы должны реализовать INotifyPropertyChanged и вызвать событие. Жаль, что вам нужно иметь полное свойство (добавить поле)

Поскольку вы можете вызывать событие только из самого класса, вам нужно реализовать метод для вызова события в базовом классе.

Например:

public class BaseViewModel : INotifyPropertyChanged
{
    protected void RaisePropertyChanged(string propertyName) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    public event PropertyChangedEventHandler PropertyChanged;

}

public class ApiViewModel : BaseViewModel
{
    private bool _customerIsChecked;

    public bool CustomerIsChecked
    {
        get { return _customerIsChecked; }
        set
        {
            _customerIsChecked = value;
            RaisePropertyChanged(nameof(CustomerIsChecked));
        }
    }
}

Также возможно создать вспомогательный метод, который заботится об измененном свойстве.

Мне нравится этот стиль, который позволяет новое выражение член,

public class BaseViewModel : INotifyPropertyChanged
{
    public bool SetField<T>(ref T field, T value, [CallerMemberName] string memberName = "")
    {
        if (field != null)
        {
            if (field.Equals(value))
                return false;
        }
        else if (value != null)
            return false;

        field = value;
        RaisePropertyChanged(memberName);
        return true;
    }

    protected void RaisePropertyChanged(string propertyName) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    public event PropertyChangedEventHandler PropertyChanged;

}

public class ApiViewModel : BaseViewModel
{
    private bool _customerIsChecked;

    public bool CustomerIsChecked
    {
        get => _customerIsChecked;
        set => SetField(ref _customerIsChecked, value);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...