Изменить не статический объект из статического контекста - PullRequest
2 голосов
/ 28 октября 2010

У меня есть следующее свойство зависимости:

public static DependencyProperty IsInReadModeProperty =
    DependencyProperty.Register("IsInReadMode", typeof(bool),
    typeof(RegCardSearchForm), new PropertyMetadata(false, ReadModeChanged));

, и у меня есть следующий метод, который обрабатывает событие Изменения свойства:

public static void ReadModeChanged(DependencyObject d,
    DependencyPropertyChangedEventArgs e)
{
    if ((bool)e.NewValue)
    {       
        btnSearch.Visibility = Visibility.Collapsed;
        btnExport.Visibility = Visibility.Collapsed;
        cbExportWay.Visibility = Visibility.Collapsed;
    }
}

Но компилятор выдает ошибку, что я не могу получить доступ к нестатическим кнопкам(btnSearch и т. д.) в статическом контексте.

Я хочу изменить видимость кнопок при изменении значения свойства.Как я могу разрешить эту ситуацию?

Ответы [ 4 ]

8 голосов
/ 28 октября 2010

Поскольку свойства DependencyProperties (не прикрепленные) ограничены указанием типа их владельца, вы можете просто создать экземплярный метод для хранения вашей логики и вызвать его из статического метода, приведя DependencyObject:

public static readonly DependencyProperty IsInReadModeProperty = DependencyProperty.Register(
    "IsInReadMode",
    typeof(bool),
    typeof(RegCardSearchForm),
    new UIPropertyMetadata(false, ReadModeChanged));

private static void ReadModeChanged(DependencyObject dObj, DependencyPropertyChangedEventArgs e)
{
    RegCardSearchForm form = dObj as RegCardSearchForm;
    if (form != null)
        form.ReadModeChanged((bool)e.OldValue, (bool)e.NewValue);
}

protected virtual void ReadModeChanged(bool oldValue, bool newValue)
{
    // TODO: Add your instance logic.
}
1 голос
/ 28 октября 2010

Одним из способов может быть расширение класса с DependencyObject, который будет содержать набор / получение элементов управления, которыми вы хотите манипулировать.И обработайте его в событии ReadModeChanged, получив доступ к DependencyObject.

. Этот пример может помочь.

... пример наследуется от DependencyObject для созданияновый абстрактный класс.Затем класс регистрирует присоединенное свойство и включает вспомогательные элементы для этого присоединенного свойства.

0 голосов
/ 29 октября 2010

Эти вещи должны быть статическими, чтобы DependencyProperty работал должным образом. Однако параметр вашего обработчика PropertyChanged, вероятно, вам нужен: это экземпляр, свойство которого только что изменилось.Я подозреваю, что это будет работать для вас:

public static void ReadModeChanged(DependencyObject d,
   DependencyPropertyChangedEventArgs e)
{
    if ((bool)e.NewValue)
    {
        RegCardSearchForm c = (RegCardSearchForm)d;
        c.btnSearch.Visibility = Visibility.Collapsed;
        c.btnExport.Visibility = Visibility.Collapsed;
        c.cbExportWay.Visibility = Visibility.Collapsed;
    }
}
0 голосов
/ 28 октября 2010

Если ReadModeChanged является статическим методом контейнера для ваших кнопок, просто сделайте его методом экземпляра контейнера.

...