1

我有一个 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;

然后将带有文档的元素的实例作为ItemsSourcefor a ListBox...

<ListBox ItemsSource="{Binding Elements[item]}">
    <!-- ... -->
</ListBox>

然后,DataTemplateListBox 中的项目具有图标和 a ToggleButton,其状态由每个元素relevant上的布尔属性的值定义。<item>我编写了自己的自定义IValueConverter类来处理 XML 布尔字符串System.Windows.Visibilitybool值之间的转换......

<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 IValueConverters 从未为这些元素调用,这表明绑定由于Attribute[relevant]存在而默默地失败null,并且null没有任何属性,更不用说 了Value

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

问题的根源似乎是如果属性不存在,绑定将不起作用,并且似乎没有办法让它具有默认值或创建属性,如果它不存在存在。那么,有没有一种方法可以让绑定按照我期望的方式运行?如果没有,有没有办法将属性添加到每个元素,如果它丢失了?

4

0 回答 0