Как узнать, что свойство типа refrence изменилось в viewmodel? - PullRequest
0 голосов
/ 18 декабря 2011

У меня есть UserControl как это:

 <Button Grid.Row="1" X:Name="ChangeButton" Click="ChangeButton_Click">Change</Button>

Мой UserControl CodeBehind:

    public static readonly DependencyProperty SelectedPersonProperty =
 DependencyProperty.Register("SelectedPerson", typeof(PersonModel), typeof(MyControl),
     new FrameworkPropertyMetadata
     {
         DefaultValue=null,
         BindsTwoWayByDefault = true

     });

    public PersonModel SelectedPerson
    {
        get { return (PersonModel)GetValue(SelectedPersonProperty); }
        set { SetValue(SelectedPersonProperty, value);}
    }
  public static readonly DependencyProperty TextValueProperty =
    DependencyProperty.Register("TextValue", typeof(string), typeof(NumericTextBox),
        new  FrameworkPropertyMetadata{
                BindsTwoWayByDefault=true

                });

    public string TextValue
    {
        get { return (string)GetValue(TextValueProperty); }
        set { 
            SetValue(TextValueProperty, value);

        }
    }
public MyControl(){
        SelectedPerson = new PersonModel();

}
 private void ChangeButton_Click(object sender, RoutedEventArgs e)
    {
        TextValue="Hello";
        SelectedPerson.Age = 12;
        SelectedPerson.FirstName = "AA";
        SelectedPerson.LastName = "BB";

    }

В моем коде Xaml MainView я имею:

<UC:MyControl SelectedPerson="{Binding Person}" TextValue="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged}" ></UC:MyControl>
  <TextBox Grid.Row="1"  Background="Yellow" Text="{Binding Path=Person.Name,UpdateSourceTrigger=PropertyChanged}"  />

MainViewModelКод:

     PersonModel person
     public PersonModel Person { 
            get { return _person; }
            set
            {

                if (_person!= value)//i set a breakpoint here
                {
                    _person= value;
                    RaisePropertyChanged("Person ");
                }
            }
 }
   string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            if (_name != value)//i set a breakpoint here.when TextValue changed this breakepoint actived
            {
            _name = value;
            RaisePropertyChanged("Name");
            }
        }
    }

, когда я нажимаю кнопку ChangeButton в моем пользовательском элементе управления, выбранный пользователь в usercontrol изменился, и мое текстовое поле в моем представлении отображает имя типа «AA». Но моя точка останова в режиме просмотра не активна. Как можноя узнаю, что когда изменилась моя персона в режиме просмотра?

Ответы [ 2 ]

4 голосов
/ 18 декабря 2011

Вам необходимо реализовать INotifyPropertyChanged внутри PersonModel и установить точку останова для свойства, которое вы изменяете, вместо всего свойства объекта Person.Вот так

class PersonModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    string name;
    public string Name
    {
        get { return name; }
        set
        {
            name = value; <---- set breakpoint here
            PropertyChanged(this, new PropertyChangedEventArgs("Name"));
        }
    }
}

Затем вы можете прослушать изменения в классе personmodel следующим образом:

myParentObject.Person.PropertyChanged += (sender,e)=>
{
    //do something here
}
1 голос
/ 19 декабря 2011

Чтобы достичь точки останова для установщика Person, вам нужно обновить ChangeButton_Click следующим образом:

private void ChangeButton_Click(object sender, RoutedEventArgs e)
    {
        TextValue="Hello";
        PersonModel newPerson = new PersonModel();
        newPerson.Age = 12;
        newPerson.FirstName = "AA";
        newPerson.LastName = "BB";
        SelectedPerson = newPerson;
    }

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

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