从静态Context更改非静态对象

时间:2010-10-28 07:35:07

标签: c# wpf dependency-properties

我有下一个属性:

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

我有下一个处理Property changed事件的方法:

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和e.t.c)。

我希望在属性值更改时更改按钮的可见性。我该如何解决这种情况?

4 个答案:

答案 0 :(得分:7)

由于(非附加)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 :(得分:1)

一种方法是从DependencyObject扩展一个类,该类包含您想要操作的控件的set / get。并通过访问ReadModeChangedDependencyObject事件中处理它。

This example可能会有所帮助。

  

...示例派生自DependencyObject以创建新的抽象类。然后,该类注册附加属性,并包含该附加属性的支持成员

答案 2 :(得分:0)

如果ReadModeChanged是按钮容器的静态方法,那么只需将其作为容器的实例方法。

答案 3 :(得分:0)

这些东西必须是静态的才能让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;
    }
}