2011-12-18 37 views
0

我有這樣的用戶控件:如何發現在viewmodel中改變了引用類型屬性?

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

我的用戶控件代碼隱藏:

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

    } 

在我的MainView XAML代碼我有:

<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中的selectedperson發生了變化,我的視圖中的文本框顯示名稱如「AA」。但我在viewmode中的breake點不是actived.how我可以找出當我的Person在viewmode改變了嗎?

回答

4

您需要在PersonModel中實現INotifyPropertyChanged,並在您更改的屬性上設置斷點而不是整個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類的變化,像這樣:

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

myParentObject.Person.PropertyChanged += (sender,e)=> 
{ 
    //do something here 
} 
+0

@Hassan Khan我需要找到它在我的viewmodel.i編輯我的問題。當TextValue更改我的名字視圖模式breakepoint激活,但爲什麼選擇人更改視圖模型中的人breakepoint不活躍? – 2011-12-18 14:55:40

1

要爲您需要更新ChangeButton_Click是繼人二傳手命中斷點你在做什麼只是修改現有的PersonModel對象的屬性。這樣你不會在PersonModel對象設置器中打斷點,但是你會在PersonModel類中的屬性設置器上打斷點。通過修改上面的代碼,你會打你斷點。

相關問題