MVC через C # / WPF: как уведомить представление? - PullRequest
3 голосов
/ 24 ноября 2010

Я делаю очень простую реализацию шаблона MVC в C # с интерфейсом WPF.

У меня есть модель, которая поддерживает состояние. Я хочу иметь возможность уведомлять представление формы из модели всякий раз, когда что-либо о состоянии изменяется, так что представление может обновляться соответствующим образом.

Какая простейшая лучшая практика для этого в WPF? Я знаю, что есть такая вещь, как событие PropertyChanged, это то, что я ищу, или это слишком специфично для моей ситуации?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 24 ноября 2010

Да. Реализовать интерфейс INotifyPropertyChanged.

Пример:

MainWindow.xaml

<Window x:Class="INotifyChangedDemo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>
    <Label Content="{Binding HitCount}"></Label>
    <Button Grid.Row="1" Click="Button_Click">
        Hit
    </Button>
</Grid>


MainWindow.xaml.cs

namespace INotifyChangedDemo
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private MainViewModel _viewModel = new MainViewModel();

        public MainWindow()
        {
            InitializeComponent();
            DataContext = _viewModel;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            _viewModel.HitCount = _viewModel.HitCount + 1;
        }
    }
}

MainViewModel.cs

namespace INotifyChangedDemo
{
    public class MainViewModel : INotifyPropertyChanged
    {
        private int _hitCount;
        public int HitCount
        {
            get
            {
                return _hitCount;
            }
            set
            {
                if (_hitCount == value)
                    return;

                _hitCount = value;
                // Notify the listeners that Time property has been changed
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("HitCount"));
                }

            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}

Для лучшей реализации INotifyChangedProperty, пожалуйста, обратитесь к этой теме: Автоматически INotifyPropertyChanged .

Если вы хотите узнать больше о шаблоне MVVM, см. Здесь: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

2 голосов
/ 24 ноября 2010

Если ваше представление связывается со свойством, объявленным в вашей модели, и ваше свойство вызывает событие PropertyChanged всякий раз, когда оно изменяется, тогда ваше представление будет автоматически обновляться с новым значением. Например, ваше представление может объявить следующее:

<TextBlock Text="{Binding Name}" />

А в вашей модели у вас будет:

string _name;
public string Name
{
    get
    {
        return _name;
    }
    set
    {
        _name = value;
        RaisePropertyChanged("Name");
    }
}

Предполагается, что вы используете какой-то фреймворк / помощник, который предоставляет метод RaisePropertyChanged. Я беру этот пример из инфраструктуры Galasoft MVVM, но я предполагаю, что в MVC применяется точно такой же принцип.

Надеюсь, это поможет.

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