Wpf DataTemplate中的后台绑定
我有以下问题。 我有一个列表框,其中的项目由DataTemplate模板化。该模板有一个网格,我希望该网格的背景根据一个值进行更改。该值由转换器计算,并向转换器传递在网格资源中创建的CollectionView(它需要在DataTemplate中创建,因为数据依赖于在列表框中选择的名称) 我就是做不到! 我尝试了很多不同的方法,但我认为问题在于我想在资源不可用的级别(Grid.Background)访问网格资源。另一方面,当我将CollectionView移动到DataTemplate的资源时,我似乎无法访问该资源(此时转换器不再工作)。。。我希望我的目标能够被充分理解 以下是所有相关代码:Wpf DataTemplate中的后台绑定,wpf,xaml,binding,resources,converter,Wpf,Xaml,Binding,Resources,Converter,我有以下问题。 我有一个列表框,其中的项目由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="✓" Style="{StaticResource personButton}" VerticalAlignment="Center" Background="Transparent" Click="button_person_balanced"/>
<Button Grid.Row="0" Grid.Column="2" Margin="1" Content="×" 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意味着越麻烦。