2016-10-06 168 views
0

我在一個WPF項目中工作,其中我的視圖模型有超過90個屬性。我點擊「保存」按鈕,將屬性保存到數據庫。我需要禁用保存按鈕,直到至少有一個屬性被修改。我不能去爲每個屬性進行OnPropertyChanged事件處理(僅僅因爲它對於超過90個屬性太麻煩)。是否有我可以這樣做,即使一個財產被更改,我應該得到通知,以便我可以啓用保存按鈕?在課堂上的OnPropertyChanged

<StackPanel> 
    <StackPanel> 
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> 
      <Button Content="{x:Static res:Resources.SaveToDB}" Command="{Binding Save}" IsEnabled="{Binding CanSaveToDB}" Margin="0,0,4,0" HorizontalAlignment="Center" Style="{StaticResource OverlayDialogButtonCentered}" FontSize="14"/> 
      <Button Content="{x:Static res:Resources.DiscardDBSave}" Command="{Binding DiscardSave}" Margin="0,0,4,0" HorizontalAlignment="Center" Style="{StaticResource OverlayDialogButtonCentered}" FontSize="14"/> 
     </StackPanel> 
     <StackPanel> 
      <views:MySampleAppView1 DataContextChanged="MySampleApp_DataContextChanged" DataContext="{Binding MySampleApp.View1}"/> 
     </StackPanel> 
     <StackPanel> 
      <views:MySampleAppView2 DataContextChanged="MySampleApp_DataContextChanged" DataContext="{Binding MySampleApp.View2}"/> 
     </StackPanel> 
     <StackPanel> 
      <views:MySampleAppView3 DataContextChanged="MySampleApp_DataContextChanged" DataContext="{Binding MySampleApp.View3}"/> 
     </StackPanel> 
     <StackPanel> 
      <views:MySampleAppView4 DataContextChanged="MySampleApp_DataContextChanged" DataContext="{Binding MySampleApp.View4}"/> 
     </StackPanel> 
     <StackPanel> 
      <views:MySampleAppView5 DataContextChanged="MySampleApp_DataContextChanged" DataContext="{Binding MySampleApp.View5}"/> 
     </StackPanel> 
     <StackPanel> 
      <views:MySampleAppView6 DataContextChanged="MySampleApp_DataContextChanged" DataContext="{Binding MySampleApp.View6}"/> 
     </StackPanel> 
     <StackPanel> 
      <views:MySampleAppView7 DataContextChanged="MySampleApp_DataContextChanged" DataContext="{Binding MySampleApp.View7}"/> 
     </StackPanel> 
</StackPanel> 

然後上面的每個視圖都有WPF控件。我對每個上述視圖都有viewmodels。然後是代表上述代碼的主視圖模型。

+0

顯示可幫助我們幫助您的一些代碼。 –

+0

添加示例代碼 –

+0

只需忽略PropertyChangedEventArgs中的PropertyName,即在第一個PropertyChanged事件觸發時立即啓用Button,而不管實際的屬性名稱如何。 – Clemens

回答

1

一個典型的解決方案是隻實現一次(通常在基類上),並從setter中調用每個屬性傳遞已更改屬性的名稱。這還是比較麻煩的。另一種方法是使用諸如Fody之類的工具來自動添加此邏輯。 如果您的所有屬性都調用單個實現,那麼可以在那裏實現設置髒標誌(以及啓用保存按鈕)的邏輯。

+0

謝謝,可以使用該工具,並再次在每個屬性上設置setter是相同的問題 –

0

作爲每Documentation

PropertyChanged事件可以指示對象 在所有屬性都通過使用空值或的String.Empty作爲PropertyChangedEventArgs屬性名 改變。

+2

這並不能解決OP在所有90個屬性的值發生變化時不得不實施通知的問題。 – Maarten

0

想到兩種方法。

首先,您並不需要在每個屬性設置器中觸發一個獨特的屬性更改通知,因爲按鈕的IsEnabled屬性不會綁定到視圖模型中90個奇怪屬性中的任何一個屬性。我真正想要的是在某些其他屬性發生更改時設置某種IsDirty屬性,將其綁定到按鈕的IsEnabled屬性,並在IsDirty更改時執行OnPropertyChanged通知程序。

但是,如果你仍然不想在你的90個屬性設置器中做任何特殊的事情,另一個選擇是在視圖控件本身中處理更改事件。例如,在所有文本框中,訂閱TextChanged。並在您的事件處理程序中,在視圖模型上設置IsDirty屬性。 (您可以訂閱控件風格中的那些處理程序,因此您不必設置事件處理程序90次。)

除了這兩個想法之外,我不認爲有任何方法可以做到您想要的。 C#中沒有內置機制在類屬性發生更改時得到通知。如果不是屬性的setter,那麼你必須自己攔截這些變更,然後在他們綁定的控件上使用事件處理程序。

+0

謝謝,我會嘗試這些,但我探索更好的選擇 –

+0

請讓我們知道,如果你找到一個!我自己會很好奇。 –

+0

我使用了開領建議的第一個選項,不能用其他方式做 –