我正在尝试创建一个Windows 8.1应用程序。每当我试图获取DataTemplate的子级(这是必要的,因为它们被嵌入到ListView中)时,我就会得到一个详细说明
灾难性故障( HRESULT: 0x8000FFFF (E_UNEXPECTED)除外)
我在这里做了一个非常简单的复制品:
在Visual中,创建一个新的Windows空白应用程序模板。在MainPage.xaml中,在OnNavigatedTo事件处理程序中,添加一行代码
var count = VisualTreeHelper.GetChildrenCount(new DataTemplate());
当您调试这个应用程序时,它马上会说“用户代码中出现了一个未处理的System.Exception”。
我已经检查了MSDN,以确保此方法不应引发任何异常。
发布于 2015-02-14 11:34:26
它失败了,因为DataTemplate
不是可视对象,也没有可视子对象。(显然,VisualTreeHelper.GetChildrenCount
并没有实际检查您是否正在传递一个可视的信息,这就是为什么您看到的是灾难性的故障而不是正常的异常)。
通常,您不需要查看ListView的可视树。通常,您可以将ItemsSource设置为包含所有需要的属性的自定义类的集合。
如果您仍然需要ListViewItem中的实际可视化--这是最后的选择--那么您将创建一个自定义附加属性(-ies),并将其附加到DataTemplate中的相关可视化中。当附加属性更改事件触发时,事件发送方将是相关的可视对象,该发件人的DataContext将是该列表项的数据值。
例如,如果您在ListView
中有一个按钮,并希望按钮单击以触发一个操作,那么您将执行如下操作:
<ListView.ItemTemplate>
<DataTemplate>
<Button MyClickHelper.ClickHandler="{Binding}"/>
</DataTemplate>
</ListView.ItemTemplate>
然后,在您的类MyClickHelper
中
private static void OnClickHandlerChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var button = (Button)d;
var data = (MyDataType)e.NewValue;
button.Click += (btn, args) =>
{
// do action here based on data above
}
}
这被称为附加行为--一个修改按钮行为的附加属性。它是一种有用的模式,它在代码的不同部分之间保持良好的边界,并且允许每个按钮具有指定的行为,而不需要某个主类直接管理所有不同的按钮。
https://stackoverflow.com/questions/28518078
复制