2016-02-04 64 views
0

我需要你的幫助了。 我使用屬性綁定來控制我的窗口中的usercontrol的可見性。我遵循一些指導,但現在我掛了。PropertyChangedEvent未被捕獲到Collapse UserControl

下面是代碼:

//ViewModel: 
    public class homeViewModel : INotifyPropertyChanged 
    { 
    public event PropertyChangedEventHandler PropertyChanged; 
    ... 
     //Property 
     private Visibility _myHome; 
     public Visibility Home 
     { 
      get { return _myHome; } 
      set { 
       _myHome = value; 
       this.PropertyChanged(this, new propertyChangedEventArgs("Home")); 
       } 
     } 
    //Command 
     public ICommand homeHideButton 
     { 
      get { return new RelayCommand(o => {hide_Click(this); });} 
     } 
     private void hide_Click(object sender= null, RoutedEventArgs e = null) 
     { 
      Home = Visibility.Collapse; 
     } 
     public ICommand homeShowButton 
     { 
      get { return new RelayCommand(o => {show_Click(this); });} 
     } 
     private void show_Click(object sender= null, RoutedEventArgs e = null) 
     { 
      Home = Visibility.Visible; 
     } 
    } 

XAML:

<Window ... > 
    <Window.DataContext> 
     <vm:homeViewModel /> 
    </Window.DataContext> 
    <StackPanel> 
     <Button Content="Show Home" Command="{Binding homeShowButton}" /> 
     <Button Content="Collapse Home" Command="{Binding homeHideButton}" /> 
     <views:home Visibility="{Binding Home }" /> 
     <!-- home is an usercontrol --> 
    </StackPanel> 
</Window> 

我覺得代碼是好的,因爲摺疊按鈕的觀點崩潰。但顯示按鈕不工作。 我認爲摺疊視圖不會捕獲propertychange事件。

回答

1

既然你綁定的知名度Home<views:home Visibility="{Binding Home}"/>你應該使用:

PropertyChanged(this, new PropertyChangedEventArgs("Home"));

這樣你調用屬性更改事件Home財產。也不需要_myHome是一個屬性。它應該是一個簡單的私人領域。

有一個名爲PropertyChanged.Fody的庫自動處理所有這些屬性更改的事件,您可能需要查看它。

如果你想手動處理PropertyChanged事件和你正在使用C#6.0(Visual Studio的2015年),你可能要使用:

PropertyChanged(this, new PropertyChangedEventArgs(nameof(Home)));

與以前的代碼,如果您重命名Home屬性,並忘記更改PropertyChanged事件中的字符串,它將默默無法通知。但是,通過這些代碼,編譯將會失敗,您將不得不修復它。

+0

你說得對。 _myHome應該是私人的。我有問題,我需要一個定製的家庭(發送通知),但如果我回家在家的getter我有一個無限循環(說vs),因此我有第二個_myHome。 – Syrlia

+0

是的,這是使用它的方式。只有'_myHome'不需要是屬性。您可以將其定義爲'private Visibility _myHome;' –

+0

YES。 Fody是一個很棒的圖書館。我可以強烈推薦它。我也可以推薦使用WPF檢查器。它是一個獨立的應用程序,允許您將它附加到您的調試應用程序,並檢查其中的所有內容。更新檢查器中的值並在UI中觀察它的更新。讓生活更容易檢測到不受限制的元素或錯誤的綁定模式。 – user853710