MVVM и Silverlight помогают - PullRequest
       7

MVVM и Silverlight помогают

0 голосов
/ 23 января 2011

Я пытаюсь изучить шаблон MVVM с помощью Silverlight.Есть тонны видео и блогов.Я понимаю это на высоком уровне, но, похоже, я не могу получить свою собственную реализацию.

Я получил следующее представление:

<UserControl x:Class="SilverlightApplication1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:vm="clr-namespace:SilverlightApplication1.ViewModel"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">
        <TextBlock Text="{Binding Name, Mode=TwoWay}" Width="200" Height="200"/>
        <Button Name="btn1" Width="200" Height="20" Margin="100,268,100,12" Click="btn1_Click"/>

    </Grid> </UserControl>

В моей виртуальной машине у меня есть: пространство имен SilverlightApplication1.ViewModel

{
    public class ViewModel : INotifyPropertyChanged
    {
        private Model.UserModel m_model;

        public ViewModel()
        {
            m_model = new Model.UserModel();
        }

        public string Name 
        {
            get
            {
                return m_model.Name;
            }
            set
            {
                if (value != m_model.Name)
                {
                    m_model.Name = value;
                    InvokePropertyChanged("Name");
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void InvokePropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }

        }


    }
}

и в моей модели:

namespace SilverlightApplication1.Model
{
    public class UserModel
    {
        public string Name { get; set; }    
    }
}

По сути, я хочу смоделировать нажатие кнопки и обновить свойство, чтобы оно могло инициировать событие изменения свойства.Я пытался жестко запрограммировать свойство в коде MainPage, например:

private void btn1_Click(object sender, RoutedEventArgs e)
        {
            ViewModel.ViewModel vm = new ViewModel.ViewModel();
            vm.Name = "Test";
        }

Разве это не должно обновлять свойство (для имени) и вызывать событие changeloaded?Я видел другие примеры, делающие что-то похожее на это.Я не понимаю, что подписывается на событие

Может ли кто-нибудь светить?

Ответы [ 2 ]

1 голос
/ 23 января 2011

В этом примере, чтобы исправить это, попробуйте этот код:

private void btn1_Click(object sender, RoutedEventArgs e)
        {
            ViewModel.ViewModel vm = new ViewModel.ViewModel();
            this.LayoutRoot.DataContext = vm;
            vm.Name = "Test";
        }

Примечание: я знаю, что вы только изучаете MVVM, но после того, как вы освоитесь с этой парадигмой, вы должны принять структуру, чтобы вы могли сосредоточиться на вещах, помимо работы с MVVM. Говоря, что делать вещи в коде позади не MVVM, как установка контекста данных. Тем не менее, я предполагаю, что вы просто экспериментируете и учитесь, так что пока все хорошо.

0 голосов
/ 23 января 2011

Я думаю, что шаг, который вы пропускаете здесь, это установка datacontext формы WPF для экземпляра вашей viewmodel. В вашем xaml установите ваш userControl datacontext для новой модели представления, как показано ниже:

<UserControl.DataContext>
  <vm:ViewModel />
</UserControl.DataContext>

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

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