如何处理WPF数据绑定中缺少的XAttributes?

时间:2019-07-12 14:39:32

标签: c# wpf linq-to-xml xaml-binding

我有一个WPF应用程序,该应用程序读取XML文件并创建要绑定的XDocument,并将其各种元素通过DataContexts等传递给其他UI元素。此应用程序读取的XML模式将元素上的一些属性标记为完全可选。

How to: Bind to XDocument, XElement, or LINQ for XML Query Results”中概述了我用于绑定的方法。该应用程序将加载XML文件或创建一个空的XDocument,然后将其分配为UI主网格的DataContext ...

XDocument newDoc = new XDocument(new XElement("mydoc"));
gridMain.DataContext = newDoc.Root;

文档元素的实例然后作为ItemsSource的{​​{1}}传递...

ListBox

然后,列表框中项目的<ListBox ItemsSource="{Binding Elements[item]}"> <!-- ... --> </ListBox> 具有图标和DataTemplate,其状态由每个ToggleButton上的布尔relevant属性值定义元件。我编写了自己的自定义<item>类来处理XML布尔字符串与IValueConverterSystem.Windows.Visibility值之间的转换...

bool

现在,如果我在每个<ListBox.ItemTemplate> <DataTemplate> <DockPanel LastChildFill="True"> <Grid Visibility="{Binding Attribute[relevant].Value, Converter={StaticResource BooleanToVisibilityConverter}}" Margin="2 0"> <StaticResource ResourceKey="RelevantIcon"/> </Grid> <Grid Visibility="{Binding Attribute[relevant].Value, Converter={StaticResource NegatedBooleanToVisibilityConverter}}" Margin="2 0"> <StaticResource ResourceKey="IrrelevantIcon"/> </Grid> <ToggleButton IsChecked="{Binding Attribute[relevant].Value, Converter={StaticResource BooleanConverter}}" VerticalAlignment="Center" Margin="2 0" Padding="5">Relevant</ToggleButton> <TextBox Text="{Binding Value}" TextWrapping="Wrap" AcceptsReturn="True" AllowDrop="True" Margin="2 0"/> </DockPanel> </DataTemplate> </ListBox.ItemTemplate> 元素都定义了其<item>属性的位置加载文档,则该文档可以正常工作。但是,该模式定义relevant可能存在或可能不存在。因此,当我创建缺少这些属性的元素或加载到文档中时,列表项视图会完全崩溃,无提示。这两个图标都出现,并且切换按钮似乎完全不起作用。断点显示我的自定义relevant从未被这些元素调用,这表明绑定由于IValueConverterAttribute[relevant]默默地失败了,并且null没有属性,让null

我尝试在Value中使用FallbackValue无济于事,并且空条件运算符在绑定中不起作用-XAML解析器将在运行时异常。

问题的根源似乎是如果属性不存在,绑定将不起作用,并且似乎没有办法使它具有默认值或创建属性(如果有)不存在。因此,有没有一种方法可以使绑定按预期的方式运行?如果没有,是否有一种方法可以将缺少的属性添加到每个元素中?

0 个答案:

没有答案