Как общаться с ViewModel из модели - PullRequest
2 голосов
/ 06 декабря 2010

Я новичок в MVVM. Поэтому, пожалуйста, исправьте меня, если я делаю какую-либо ошибку в реализации MVVM.

В моем классе Model есть два свойства Price и IsChecked.

    public int Price { get; set; }
    public static int _total;

    bool _isChecked;
    public bool IsChecked
    {

        get
        {
            return _isChecked;

        }
        set
        {
            _isChecked = value;

            if (value == true)
            {
                _total+= this.Price;
            }
            else
            {
                _total-= this.Price;
            }


        }
    }

В My ViewModel Class есть свойство Type List , и оно ограничено сеткой данных в представлении, а другое свойство - Total, которое связано с textBlock в View.

    public int Total
    {
        get
        {
            return  DocumentStoreModel._total;

        }
        set
        {

        }

    }

DataGrid имеет столбец checkBox и ограничен свойством Ischecked

<DG:DataGridCheckBoxColumn Header="Select" Binding="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ></DG:DataGridCheckBoxColumn>

Теперь, если пользователь установил флажок Флажок из флажка в DataGrid, итоговое значение должно быть отражено в представлении.

Мой класс ViewModel реализует интерфейс INotifyPropertyChanged.

Мой вопрос: если свойство моей модели меняется, как я могу сообщить об этом своей viewModel?

пожалуйста, дайте мне знать, как мне этого добиться.

Ответы [ 3 ]

2 голосов
/ 06 декабря 2010

Из того, что я могу сказать, свойство Total вашей ViewModel указывает на свойство Total вашей модели, поэтому любые изменения, которые вы вносите в общее количество модели, будут существенно изменены и для ViewModel.

Возможно, вам придется вызвать событие PropertyChanged для свойства Total в ViewModel при изменении IsChecked.Это скажет вашему представлению обновить данные для вашего общего текстового блока.

0 голосов
/ 06 декабря 2010

Поскольку вы выставляете свою модель в пределах ViewModel, вам необходимо внедрить INotifyPropertyChanged в вашу модель.Однако у вас есть проблема в том, что ваше свойство Total является статическим и (на самом деле) вы не можете использовать INotifyPropertyChanged для статических свойств.Я бы посоветовал вам создать пользовательское событие для вашей модели, на которое можно подписаться на вашем ViewModel.Вот пример (вы можете немного привести в порядок).

public class Model : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    internal static event EventHandler TotalChanged;
    internal static int Total { get; private set;}

    private int price;
    public int Price
    {
        get { return price; }
        set
        {
            price = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("Price"));
        }
    }

    private bool isChecked;
    public bool IsChecked
    {
        get { return isChecked; }
        set
        {  isChecked = value; 
            if (value)
                Total += Price;
            else
                Total -= Price;
            if (TotalChanged != null)
                TotalChanged(this, EventArgs.Empty);
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("IsChecked"));
        }
    }
}

public class MainViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public int Total
    {
        get { return Model.Total;  }
    }

    public MainViewModel()
    {
        Model.TotalChanged += TotalChanged;
    }

    private void TotalChanged(object sender, EventArgs e)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs("Total"));
    }
}
0 голосов
/ 06 декабря 2010

Вам необходимо реализовать Command (реализуя ICommand или его варианты) и выставить как свойство в ViewModel и bind в представлении для события на флажок.

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