1

我遇到了从嵌套数据模板(ListViewItems)调用的 IValueConverters 的问题。

我有包含其他对象的复杂(列表)对象和对象列表列表(源代码太多,无法全部放在这里)......

除了在更深的嵌套级别上的 IValueConverter 实现之外,一切都很好......

简化和缩短的 XAML:

    <Window x:Class="XXXX.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:converter="clr-namespace:XXXX.Converter"
    Width="800"
    Height="600"
    Icon="/Images/Icons/Calendar.ico"
    Loaded="Window_Loaded"
    Style="{StaticResource WindowDefaultStyle}"
    WindowState="Maximized">
<Window.Resources>
    <!--  <converter:ValueToVisibilityConverter x:Key="ValueToVisibility" />  -->
    <converter:PercentageConverter x:Key="PercentFromValue" />
    <converter:SubtractionConverter x:Key="SubstractFromValue" />
    <converter:SingleTextLineConverter x:Key="inSingleLine" />
    <converter:B2VConverter x:Key="B2V" />
</Window.Resources>

    <Grid Name="grid_Supplier">
        <ListView Name="listview_Product"
            Grid.Row="1"
            Height="{Binding ElementName=grid_Supplier,
            Path=ActualHeight,
            Converter={StaticResource SubstractFromValue},
            ConverterParameter=60}"
            ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
            AncestorType=Window},Path=SuppliersProducts}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ListView Name="listview_CM"
                                Width="{Binding ElementName=grid_SupplierProduct,
                                Path=ActualWidth,
                                Converter={StaticResource PercentFromValue},
                                ConverterParameter=80}"
                                ItemsSource="{Binding CM}">
                                <ListView.ItemTemplate>
                                    <DataTemplate>
                                        <ListView Name="listview_Comments"
                                            ItemsSource="{Binding Comments}">
                                            <ListView.ItemTemplate>
                                                <DataTemplate>
                                                    <TextBlock
                                                            Text="{Binding Comment.DueDate, StringFormat='dd.MM.yyyy'}"
                                                            Background="{Binding Status

, 转换器={StaticResource B2V}

}"/>
                                                </DataTemplate>
                                            </ListView.ItemTemplate>
                                        </ListView>
                                    </DataTemplate>
                                </ListView.ItemTemplate>
                        </ListView>
                    </DataTemplate>
                </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Window>

如您所见,有 3 个嵌套的 ListView,“第一”级的转换器 (PercentFromValue) 可以正常工作 - 使用绑定和参数...

一旦存在绑定的转换器部分( StaticResource B2V ),我的问题就在下一个嵌套“级别”,在运行时出现空引用异常(没有进一步的解释或嵌套异常信息可用...... - 但尽快由于转换器不见了,所以没有问题......好吧,没有例外,但也没有背景 - 正如所料......)

我试图创建“listview 资源”部分,但也出现了空引用异常(我假设在这种情况下找不到路径的“转换器:”部分。

由于我使用的是 Backgroundworker(gui 上显示的信息是从 9 个以上相关表中收集的),因此无法将 Brush 传递给 gui(从 Dispatcher 继承并导致“DependencySource must be created in the same thread as DependencyProperty”错误) .

现在我正在后台准备所有内容,并且只在与解决方法相同的线程中添加背景画笔,但它很难看......

使用转换器会好得多,但是如何从嵌套数据模板中引用它呢?

非常感谢您的帮助!

4

1 回答 1

2

我自己解决了这个问题,方法是移动 Window.Resources 中的 DataTemplates 并使它们相互引用,从而创建不再直接嵌套的“平面”结构......

<Window x:Class="XXXX.MainWindow"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:converter="clr-namespace:XXXX.Converter"
   Width="800"
   Height="600"
   Icon="/Images/Icons/Calendar.ico"
   Loaded="Window_Loaded"
   Style="{StaticResource WindowDefaultStyle}"
   WindowState="Maximized">
<Window.Resources>
   <converter:PercentageConverter x:Key="PercentFromValue" />
   <converter:SubtractionConverter x:Key="SubstractFromValue" />
   <converter:SingleTextLineConverter x:Key="inSingleLine" />
   <converter:B2VConverter x:Key="B2V" />

   <DataTemplate x:Key="CommentTemplate">
<TextBlock Text="{Binding Comment.DueDate, StringFormat='dd.MM.yyyy'}" Background="{Binding Status, Converter={StaticResource B2V}}"
   </DataTemplate>

   <DataTemplate x:Key="CommentsTemplate">
<ListView Name="listview_Comments"
          ItemsSource="{Binding Comments}"
            ItemTemplate={StaticResource CommentTemplate} />
   </DataTemplate>


   <DataTemplate x:Key="CMTemplate">
        <ListView Name="listview_CM"
        Width="{Binding ElementName=grid_SupplierProduct,
        Path=ActualWidth,
        Converter={StaticResource PercentFromValue},
        ConverterParameter=80}"
        ItemsSource="{Binding CM}"
        ItemTemplate={StaticResource CommentsTemplate} />
   </DataTemplate>

</Window.Resources>

<Grid Name="grid_Supplier">
    <ListView Name="listview_Product"
        Grid.Row="1"
        Height="{Binding ElementName=grid_Supplier,
        Path=ActualHeight, Converter={StaticResource SubstractFromValue},
        ConverterParameter=60}"
        ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
        AncestorType=Window},Path=SuppliersProducts}"
        ItemTemplate={StaticResource CMTemplate}/>
</Grid>

注意最里面的模板被定义为第一个,依此类推。否则将找不到模板。

由于文件的这种结构,我们在一个级别上拥有所有“平面”,并且找到并引用了转换器。

于 2013-10-08T06:55:23.753 回答