MVVM和Silverlight的帮助

时间:2011-01-23 16:54:37

标签: silverlight mvvm

我正在尝试使用Silverlight学习MVVM模式。有大量的视频和博客。我在高层次上理解它,但似乎无法自己实现它。

我得到了以下视图:

<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";
        }

这不应该更新属性(对于Name)并引发propertychanged事件吗?我已经看到其他例子做了类似的事情。我不明白订阅活动的内容

任何人都能发光吗?

2 个答案:

答案 0 :(得分:1)

在此示例中,要修复它,请尝试以下代码:

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

注意:我知道你刚刚学习MVVM,但是在对这个范例感到满意之后,你应该采用一个框架,这样你就可以专注于MVVM管道之外的事情了。在说,在代码隐藏中做事不是MVVM方式,比如设置数据上下文。但是,我认为你只是在尝试和学习,所以现在好了。

答案 1 :(得分:0)

我认为你在这里缺少的步骤是将WPF表单的datacontext设置为viewmodel的一个实例。在你的xaml中,将你的UserControl datacontext设置为一个新的viewmodel,如下所示:

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

然后只需在你的虚拟机中执行常规设置,它就应该将更改冒泡到绑定中。