我有一个 WPF 应用程序,它读取 XML 文件并创建一个XDocument
要绑定的对象,通过 DataContexts 等将其各种元素传递给其他 UI 元素。此应用程序读取的 XML 模式将元素上的一些属性标记为完全可选的。
“如何:为 XML 查询结果绑定到 XDocument、XElement 或 LINQ ”中概述了我用来绑定的方法。应用程序将加载一个 XML 文件或创建一个空的 XDocument,然后将其分配DataContext
为 UI 的主网格...
XDocument newDoc = new XDocument(new XElement("mydoc"));
gridMain.DataContext = newDoc.Root;
然后将带有文档的元素的实例作为ItemsSource
for a ListBox
...
<ListBox ItemsSource="{Binding Elements[item]}">
<!-- ... -->
</ListBox>
然后,DataTemplate
ListBox 中的项目具有图标和 a ToggleButton
,其状态由每个元素relevant
上的布尔属性的值定义。<item>
我编写了自己的自定义IValueConverter
类来处理 XML 布尔字符串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
可能存在也可能不存在。因此,当我在缺少这些属性的文档中创建元素或加载时,列表项视图会以静默方式完全中断。两个图标都出现了,切换按钮似乎什么也没做。断点显示我的 custom IValueConverter
s 从未为这些元素调用,这表明绑定由于Attribute[relevant]
存在而默默地失败null
,并且null
没有任何属性,更不用说 了Value
。
我尝试使用FallbackValue
inBinding
无济于事,并且空条件运算符在绑定中不起作用 - XAML 解析器将在运行时异常。
问题的根源似乎是如果属性不存在,绑定将不起作用,并且似乎没有办法让它具有默认值或创建属性,如果它不存在存在。那么,有没有一种方法可以让绑定按照我期望的方式运行?如果没有,有没有办法将属性添加到每个元素,如果它丢失了?