【问题标题】:Monitor for ListView.View changes监视 ListView.View 更改
【发布时间】:2017-10-12 09:19:12
【问题描述】:

我想从 GridViewListView 后面的代码中设置样式。由于那是 ListView.View 依赖属性,我想监视它何时更改。

尝试添加来自this answer的依赖属性更改回调:

var handler = new DependencyPropertyChangedEventHandler(Handler);
DependencyPropertyDescriptor.FromProperty(ListView.ViewProperty,
    typeof(ListView)).AddValueChanged(listView, handler);

处理程序在哪里

void Handler(object sender, DependencyPropertyChangedEventArgs e) { ... }

会导致编译错误:

错误 CS1503 参数 2:无法从“System.Windows.DependencyPropertyChangedEventHandler”转换为“System.EventHandler”

尝试强制转换 (EventHandler)handler 仍然让编译器抱怨:

错误 CS0030 无法将类型“System.Windows.DependencyPropertyChangedEventHandler”转换为“System.EventHandler”


如果我尝试使用标准事件处理程序:

var handler = new EventHandler(Handler);

在哪里

void Handler(object sender, EventArgs e) { ... }

使其可编译,但随后会在运行时崩溃

PresentationFramework.dll 中出现“System.ArgumentException”类型的未处理异常

附加信息:处理程序类型无效。

我还能尝试什么让AddValueChanged 使用依赖属性回调?也许方法是错误的,为什么?当ListView.View 更改时,我还能如何获得通知?

我不想应用 this answer 中的任何一个解决方案:不能使用绑定(值将在 xaml 中设置)并且不想只为此创建 MyListView

【问题讨论】:

    标签: c# wpf listview dependency-properties


    【解决方案1】:

    这对我有用:

    public MainWindow()
    {
        InitializeComponent();
    
        DependencyPropertyDescriptor
            .FromProperty(ListView.ViewProperty, typeof(ListView))
            .AddValueChanged(listView, ViewChanged);
    
        listView.View = new GridView();
    }
    
    private void ViewChanged(object sender, EventArgs e)
    {
        Debug.WriteLine("ViewChanged");
    }
    

    【讨论】:

    • 感谢您的检查,这真的很有帮助。该错误确实来自另一个事件处理程序(这使我的问题很糟糕),但我猜标题+答案可能对其他人有用。
    猜你喜欢
    • 2012-08-12
    • 2010-12-13
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多