我有下一个属性:
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)。
我希望在属性值更改时更改按钮的可见性。我该如何解决这种情况?
答案 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。并通过访问ReadModeChanged
在DependencyObject
事件中处理它。
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;
}
}