代码之家  ›  专栏  ›  技术社区  ›  p0lar_bear

如何处理丢失的贡品?

  •  0
  • p0lar_bear  · 技术社区  · 5 年前

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

    “中概述了我用于绑定的方法” How to: Bind to XDocument, XElement, or LINQ for XML Query Results DataContext

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

    元素的实例与文档一起作为 ItemsSource 为了一个 ListBox

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

    然后,这个 DataTemplate 对于列表框中的项目,有图标和 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>
    

    <项目> 相关的 属性定义后,这将按预期工作。但是,模式定义了 可能存在也可能不存在。因此,当我在缺少这些属性的文档中创建一个元素或加载时,列表项视图会完全中断。两个图标都出现了,切换按钮似乎什么也不做。断点显示我的习惯 IValueConverter公司 从不为这些元素调用,这表示绑定由于 Attribute[relevant] null ,和 无效的 没有财产,更别说了 Value .

    我试过用 FallbackValue Binding 没有任何效果,并且空条件运算符在绑定中不起作用-XAML解析器将在运行时出现异常。

    0 回复  |  直到 5 年前