INotifyPropertyChanged事件没有提升

时间:2014-07-30 02:19:00

标签: wpf c#-4.0 mvvm

我在使用C#编写WPF时有一个名为FormModel.cs的Model类。

以下是我的代码。我很无能,即使调试器进入Name的setter方法,PropertyChanged标志也没有提升。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;


namespace MVVM.Models
{
public class FormModel : INotifyPropertyChanged
{
        private string _name;

        public FormModel()
        {
            _name = "";
            _bColor = "";
            _fColor = "";
        }
        public string Name
        {
            get { return _name; }
            set 
            { 
                _name = value;
                NotifyPropertyChanged("Name");
            }
        }
        private string _bColor;

        public string BColor
        {
            get { return _bColor; }
            set { _bColor = "RED"; }
        }
        private string _fColor;

        public string FColor
        {
            get { return _fColor; }
            set { _fColor = "BLUE"; }
        }
        public void apply(string Name, string BColor, string FColor)
        {
            this.Name = Name;
            this.BColor = BColor;
            this.FColor = FColor;
        }
        public event PropertyChangedEventHandler PropertyChanged;


        public void NotifyPropertyChanged(string propName)
            {
                if(this.PropertyChanged!=null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
                    if(propName=="Name")
                    {
                        MessageBox.Show("Hi" + Name);
                    }
                }
            }

    }
}

以下是我根据要求在编辑中编辑的剩余文件

MainViewModel.cs

using MVVM.Models;
using MVVM.Views;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.Windows.Input;
using System.Windows;

namespace MVVM.ViewModels
{
public class MainViewModel : ViewModelBase
{
    private FormModel FModel;
    private ICommand refresh;

    public ICommand Refresh
    {
        get { return refresh; }
        set { refresh = value; }
    }

    public MainViewModel()
    {
        FModel = new FormModel();
        string s = "Pratik";
        object o=(object)s;

        refresh = new RelayCommand(new Action<object>(getGreet));

    }
    public void getGreet(object s1)
   {
       FModel.apply("dsf", "sf", "sf");
       MessageBox.Show(s1.ToString());
   }
    private string _name;

    public string Name
    {
        get { return _name; }
        set {
            _name = value;
            FModel.Name = value;
            }
    } 

}
class RelayCommand : ICommand
{
    private Action<object> _action;
    public RelayCommand(Action<object> action)
    {
        _action = action;
    }
    public bool CanExecute(object parameter)
    {
        return true;
    }
    public event EventHandler CanExecuteChanged;
    public void Execute(object parameter)
    {
        _action(parameter);
    }

}

}

ViewModelBase.cs

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

namespace MVVM.ViewModels
{
public abstract class ViewModelBase: INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if(handler!=null)
        {
            if (propertyName == "Name")
            {
                //Command
                handler(this, new PropertyChangedEventArgs(propertyName));

            }
        }
    }
}
}

以下是查看文件

MainView.xaml

<Window x:Class="MVVM.Views.MainView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:VM="clr-namespace:MVVM.ViewModels"
    Title="UI" Height="300" Width="300">
<Grid Background="RED">

    <TextBox Name="TT" TextWrapping="Wrap" Text="{Binding Name}" Margin="20,15,160,225" />


    <TextBox TextWrapping="Wrap" Text="Back Color" Margin="20,73,195,167" />
    <TextBox TextWrapping="Wrap" Text="Font Color" Margin="20,122,195,118"/>
    <Label Content="getGreet" HorizontalAlignment="Left" Margin="187,90,0,0" VerticalAlignment="Top"/>

    <Button Content="Finish" Command="{Binding Refresh}" HorizontalAlignment="Left" Margin="112,163,0,0" VerticalAlignment="Top" Width="75"/>

</Grid>
</Window>

MainView.xaml.cs

//using MVVM.Models;
using MVVM.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace MVVM.Views
{
/// <summary>
/// Interaction logic for UI.xaml
/// </summary>
public partial class MainView : Window
{
    public MainView()
    {
        InitializeComponent();
        this.DataContext  = new MainViewModel();
    }


}
}

主要档案......

的App.xaml

<Application x:Class="MVVM.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Startup="OnStartup">
<Application.Resources>

</Application.Resources>
</Application>

App.xaml.cs

using MVVM.ViewModels;
using MVVM.Views;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;

namespace MVVM
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    public void OnStartup(object sender, StartupEventArgs e)
    {
       // Create the ViewModel and expose it using the View's DataContext
        MainView view = new MainView();
        view.DataContext  = new MainViewModel();
        view.Show();
    }
}
}

请帮忙。

1 个答案:

答案 0 :(得分:0)

您绑定到MainViewModel的Name属性而不是Model的Name属性。即使认为这实际上是Model.Name属性的直通,绑定也附加到MainViewModel的PropertyChanged事件,而不会在setter中引发。

在MainViewModel.Name属性的setter中添加一个OnPropertyChanged调用,它应该可以工作。

public string Name
{
    get { return _name; }
    set 
    {
        _name = value;
        FModel.Name = value;
        OnPropertyChanged("Name");
    }
}