监视ListView.View更改

时间:2017-10-12 09:19:13

标签: c# wpf listview dependency-properties

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

尝试从this answer添加依赖项属性更改回调:

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

其中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。< / p>

1 个答案:

答案 0 :(得分: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");
}