我有一个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布尔字符串与IValueConverter
和System.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
从未被这些元素调用,这表明绑定由于IValueConverter
被Attribute[relevant]
默默地失败了,并且null
没有属性,让null
。
我尝试在Value
中使用FallbackValue
无济于事,并且空条件运算符在绑定中不起作用-XAML解析器将在运行时异常。
问题的根源似乎是如果属性不存在,绑定将不起作用,并且似乎没有办法使它具有默认值或创建属性(如果有)不存在。因此,有没有一种方法可以使绑定按预期的方式运行?如果没有,是否有一种方法可以将缺少的属性添加到每个元素中?