Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf DataTemplate中的后台绑定_Wpf_Xaml_Binding_Resources_Converter - Fatal编程技术网

Wpf DataTemplate中的后台绑定

Wpf DataTemplate中的后台绑定,wpf,xaml,binding,resources,converter,Wpf,Xaml,Binding,Resources,Converter,我有以下问题。 我有一个列表框,其中的项目由DataTemplate模板化。该模板有一个网格,我希望该网格的背景根据一个值进行更改。该值由转换器计算,并向转换器传递在网格资源中创建的CollectionView(它需要在DataTemplate中创建,因为数据依赖于在列表框中选择的名称) 我就是做不到! 我尝试了很多不同的方法,但我认为问题在于我想在资源不可用的级别(Grid.Background)访问网格资源。另一方面,当我将CollectionView移动到DataTemplate的资源时,

我有以下问题。 我有一个列表框,其中的项目由DataTemplate模板化。该模板有一个网格,我希望该网格的背景根据一个值进行更改。该值由转换器计算,并向转换器传递在网格资源中创建的CollectionView(它需要在DataTemplate中创建,因为数据依赖于在列表框中选择的名称)

我就是做不到! 我尝试了很多不同的方法,但我认为问题在于我想在资源不可用的级别(Grid.Background)访问网格资源。另一方面,当我将CollectionView移动到DataTemplate的资源时,我似乎无法访问该资源(此时转换器不再工作)。。。我希望我的目标能够被充分理解

以下是所有相关代码:

<Window.Resources>
    <local:newConverter x:Key="newConverter" />

    <Style x:Key="personButton" TargetType="{x:Type Button}">
        <Setter Property="Visibility" Value="Hidden" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsMouseOver}" Value="True">
                <Setter Property="Visibility" Value="Visible" />
            </DataTrigger>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsMouseOver}" Value="False">
                <Setter Property="Visibility" Value="Hidden" />
            </DataTrigger>
        </Style.Triggers>
    </Style>

    <DataTemplate x:Key="listBoxTemplate" >
        <Grid Name="personGrid" Margin="1">
            <Grid.RowDefinitions>
                <RowDefinition Height="1*" />
                <RowDefinition Height="1*" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="1*" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>

            <Grid.Resources>
                <CollectionViewSource x:Key="items" Source="{Binding XPath=item}">
                    <CollectionViewSource.GroupDescriptions>
                        <PropertyGroupDescription PropertyName="@name"/>
                    </CollectionViewSource.GroupDescriptions>
                </CollectionViewSource>
            </Grid.Resources>

            <WrapPanel Grid.Row="0" Grid.Column="2" HorizontalAlignment="Right">
                <Button Grid.Row="0" Grid.Column="2" Margin="1" Content="&#x2713;" Style="{StaticResource personButton}" VerticalAlignment="Center" Background="Transparent" Click="button_person_balanced"/>
                <Button Grid.Row="0" Grid.Column="2" Margin="1" Content="&#x00D7;" Style="{StaticResource personButton}" VerticalAlignment="Center" Background="Transparent" Click="button_person_delete"/>
            </WrapPanel>
            <Label Grid.Row="0" Grid.Column="1" Content="{Binding Source={StaticResource items}, Converter={StaticResource newConverter}, ConverterParameter=items}" />
            <Label Grid.Row="1" Grid.Column="0" Content="{Binding Source={StaticResource items}, Converter={StaticResource newConverter}, ConverterParameter=date}" />
            <Label Grid.Row="1" Grid.Column="2" Content="{Binding Source={StaticResource items}, Converter={StaticResource newConverter}, ConverterParameter=sum}" HorizontalAlignment="Right" />

            <Grid.Background>
                <Binding Source="{StaticResource items}" Converter="{StaticResource newConverter}" ConverterParameter="background" />
            </Grid.Background>

        </Grid>
    </DataTemplate>
</Window.Resources>

<ListBox Name="PersonListBox" ItemTemplate="{StaticResource listBoxTemplate}" DataContext="{Binding}">
            <ListBox.Resources>
                <CollectionViewSource x:Key="SortedItems" Source="{Binding}">
                    <CollectionViewSource.SortDescriptions>
                        <scm:SortDescription PropertyName="@name"/>
                    </CollectionViewSource.SortDescriptions>
                </CollectionViewSource>
            </ListBox.Resources>

            <ListBox.ItemsSource>
                <Binding Source="{StaticResource SortedItems}"/>
            </ListBox.ItemsSource>
        </ListBox>

下面是转换器的代码(一切正常,背景部分返回正确的值,但是背景的颜色没有设置好(背景返回一个简单的字符串就足够了)):

class newConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
CollectionView项=作为CollectionView的值;
if(items==null)
返回null;
浮点数和=0;
foreach(项目中的XmlNode节点)
{
sum+=float.Parse(node.Attributes.GetNamedItem(“value”).InnerText);
}
开关((字符串)参数)
{
案例“金额”:
返回金额。ToString(“C”);
案例“项目”:
返回items.Groups.Count+“items”;
案件“日期”:
DateTime minDate=DateTime.MinValue;
foreach(项目中的XmlNode节点)
{
if(DateTime.Parse(node.Attributes.GetNamedItem(“date”).InnerText)>=minDate)
minDate=DateTime.Parse(node.Attributes.GetNamedItem(“日期”).InnerText);
}
如果(items.Count==0)
return DateTime.Now.ToShortDateString();
其他的
返回“noDateSet”;
案例“背景”:
如果(总和>0)
返回“浅绿色”;
如果(总和<0)
返回“印度红”;
其他的
返回“天蓝色”;
违约:
返回“缺少参数”;
}
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回null;
}
}
我非常感谢您的帮助,我已经在这件事上坐了好几天了


关于

这是一种非常可怕的做法,请告诉我正确的方法:)简单的做法是抛弃XML并将其反序列化为可以使用的适当CLR对象,操作越复杂,XML意味着越麻烦。