Ошибка «DependencyProperty уже определена» в производном классе? - PullRequest
1 голос
/ 31 января 2012

Моя программа должна иметь одну цветовую схему для дневных часов и более темную для ночных часов.Я определил перечисление TimesOfDay:

public enum TimesOfDay { DayTime, NightTime }

У меня есть пользовательский элемент управления, полученный из окна с именем CarSystemDialog:

    public class CarSystemDialog : Window {

    public static readonly DependencyProperty TimeOfDayModeProperty =
        DependencyProperty.Register( "TimeOfDayMode", typeof( TimesOfDay ), typeof( CarSystemDialog ),
                                     new FrameworkPropertyMetadata( TimesOfDay.DayTime,
                                         FrameworkPropertyMetadataOptions.AffectsRender,
                                         new PropertyChangedCallback( OnTimeOfDayInvalidated ) ) );

    public TimesOfDay TimeOfDayMode {
        get { return (TimesOfDay) GetValue( TimeOfDayModeProperty ); }
        set { SetValue( TimeOfDayModeProperty, value ); }
    }

    static CarSystemDialog() {
        DefaultStyleKeyProperty.OverrideMetadata( typeof( CarSystemDialog ), new FrameworkPropertyMetadata( typeof( CarSystemDialog ) ) );
    }

    private void Grid_MouseLeftButtonDown( object sender, MouseButtonEventArgs e ) {
        DragMove();
    }

    private static void OnTimeOfDayInvalidated( DependencyObject d, DependencyPropertyChangedEventArgs e ) {
        // Convert the DependencyObject into an AlarmDisplayer instance
        CarSystemDialog dialog = (CarSystemDialog) d;

        // Let the instance handle the event.
        dialog.OnTimeOfDayModeChanged( d, e );
    }

    public override void OnApplyTemplate() {
        base.OnApplyTemplate();
        Grid grid = (Grid) Template.FindName( "PART_TitleBar", this );
        grid.MouseLeftButtonDown += Grid_MouseLeftButtonDown;
    }

    public virtual void OnTimeOfDayModeChanged( object sender, DependencyPropertyChangedEventArgs e ) {

    }
}

Это прекрасно компилируется.

У меня есть UserControlкласс, который происходит от CarSystemDialog:

public partial class SettingsDialog : CarSystemDialog {

    public static readonly DependencyProperty VolumeProperty =
        DependencyProperty.Register( "Volume", typeof( double ), typeof( SettingsDialog ),
                                     new PropertyMetadata( 0.5, new PropertyChangedCallback( OnVolumeInvalidated ) ) );

    protected App Application { get; set; }

    public double Volume {
        get { return (double) GetValue( VolumeProperty ); }
        set { SetValue( VolumeProperty, value ); }
    }

    public SettingsDialog() 
        : base() {
        InitializeComponent();

        // Initialize the Application property
        Application = (App) App.Current;

        // Get the current value of the Volume property
        Volume = (double) Application.CurrentUserProfile.Volume;
    }

    private void AdvancedButton_Click( object sender, RoutedEventArgs e ) {
        Application.CurrentUserProfile.Save();
        Close();
        MainWindow mainWindow = (MainWindow) Application.MainWindow;
        mainWindow.ReadsDisplay.Visibility = Visibility.Collapsed;
        mainWindow.AdvancedSettingsEditor.Visibility = Visibility.Visible;
        e.Handled = true;
    }

    private void CloseButton_Click( object sender, RoutedEventArgs e ) {
        MainWindow window = (MainWindow) Application.MainWindow;
        window.Volume = Volume;
        Application.ConfigurationFile.Save();
        Close();
        e.Handled = true;
    }

    private void DayButton_Click( object sender, RoutedEventArgs e ) {
        MainWindow window = (MainWindow) Application.MainWindow;
        window.DayButton_Click( sender, e );
        e.Handled = true;
    }

    private void Grid_MouseLeftButtonDown( object sender, MouseButtonEventArgs e ) {
        DragMove();
        e.Handled = true;
    }

    public override void OnTimeOfDayModeChanged( object sender, DependencyPropertyChangedEventArgs e ) {
        throw new NotImplementedException();
    }

    private void OnVolumeChanged( object sender, DependencyPropertyChangedEventArgs e ) {
        Application.CurrentUserProfile.Volume = (double) e.NewValue;
    }

    private static void OnVolumeInvalidated( DependencyObject d, DependencyPropertyChangedEventArgs e ) {
        SettingsDialog window = (SettingsDialog) d;
        window.OnVolumeChanged( window, e );
    }

    private void NightButton_Click( object sender, RoutedEventArgs e ) {
        MainWindow window = (MainWindow) Application.MainWindow;
        window.NightButton_Click( sender, e );
        e.Handled = true;
    }

    private void SettingsDialog_Closed( object sender, EventArgs e ) {
        Application.CurrentUserProfile.Save();
    }
}

}

Весь код этого класса компилируется нормально, но во время выполнения, когда создается экземпляр пользовательского элемента управления, я получаю следующую ошибку:

Инициализатор типа для «MyProject.MyDialog» выдал исключение: свойство «TimeOfDayMode» уже зарегистрировано «MyDialog».

В чем причина этой ошибки?Как мне это исправить?

Спасибо

Тони

1 Ответ

4 голосов
/ 01 февраля 2012

Я нашел проблему. В другом классе, называемом CarSystemWindow, я определил то же свойство, скопировав и вставив определение свойства из CarSystemDialog. Я забыл изменить имя типа в этой копии свойства с CarSystemDialog на CarSystemWindow.

Я исправил имя и теперь все нормально.

В любом случае, спасибо.

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