C# 具有相关属性的UWP值转换器
我有一个UWP项目,我正试图在我的C# 具有相关属性的UWP值转换器,c#,uwp,dependency-properties,valueconverter,C#,Uwp,Dependency Properties,Valueconverter,我有一个UWP项目,我正试图在我的ValueConverter上获得一个绑定 它是基于 我已在ValueConverter上创建了一个dependencProperty,但它总是null,而不是Vehicle类型的元素 这是我的代码: MainPage.xaml <Page x:Class="Project.Pages.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
ValueConverter
上获得一个绑定
它是基于
我已在ValueConverter
上创建了一个dependencProperty
,但它总是null
,而不是Vehicle
类型的元素
这是我的代码:
MainPage.xaml
<Page
x:Class="Project.Pages.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:conv="using:Project.Converters"
>
<Page.Resources>
<conv:Item_to_FullItem x:Key="Item_to_FullItem" VehicleItem="{Binding}"/>
</Page.Resources>
<Grid>
<ListView x:Name="ListView_Vehicles" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ListView.ItemTemplate>
<DataTemplate>
<Grid ScrollViewer.VerticalScrollBarVisibility="Auto">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<Border Grid.Column="0" BorderThickness="1" BorderBrush="Black">
<TextBlock Text="{Binding Path=Category}"/>
</Border>
<Border Grid.Column="1" BorderThickness="1" BorderBrush="Black">
<TextBlock Text="{Binding Item, Converter={StaticResource Item_to_FullItem}}"/>
</Border>
<Border Grid.Column="2" BorderThickness="1" BorderBrush="Black">
<TextBlock Text="{Binding Path=Weight}"/>
</Border>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Page>
问题是,当您在
部分中使用{Binding}
时,绑定将在那时和那里相对于页面的数据上下文进行评估。如果在页面
的构造函数中设置了DataContext=new Vehicle()
,则可以验证这一点
要解决此问题,只需将转换器移动到DataTemplate
声明中:
<DataTemplate>
<Grid ScrollViewer.VerticalScrollBarVisibility="Auto">
<Grid.Resources>
<converters:Item_to_FullItem x:Key="Item_to_FullItem" VehicleItem="{Binding}"/>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<Border Grid.Column="0" BorderThickness="1" BorderBrush="Black">
<TextBlock Text="{Binding Path=Category}"/>
</Border>
<Border Grid.Column="1" BorderThickness="1" BorderBrush="Black">
<TextBlock Text="{Binding Item, Converter={StaticResource Item_to_FullItem}}"/>
</Border>
<Border Grid.Column="2" BorderThickness="1" BorderBrush="Black">
<TextBlock Text="{Binding Path=Weight}"/>
</Border>
</Grid>
</DataTemplate>
这样,绑定
的数据上下文将是当前的列表视图
项,它应该按预期工作
namespace Project.Converters
{
class Item_to_FullItem : DependencyObject, IValueConverter
{
public Vehicle VehicleItem
{
get { return (Vehicle)GetValue(dependencyProperty); }
set { SetValue(dependencyProperty, value); }
}
public static readonly DependencyProperty dependencyProperty =
DependencyProperty.Register(nameof(VehicleItem), typeof(Vehicle), typeof(Item_to_FullItem), new PropertyMetadata(null));
public object Convert(object value, Type targetType, object parameter, string language)
{
if (VehicleItem != null)
{
if (value != null)
{
string _formatedValue = string.Empty;
switch (VehicleItem.Category)
{
case 1:
return "#" + value.ToString();
case 2:
case 3:
return value.ToString() + "º";
default:
return value.ToString();
}
}
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
}
<DataTemplate>
<Grid ScrollViewer.VerticalScrollBarVisibility="Auto">
<Grid.Resources>
<converters:Item_to_FullItem x:Key="Item_to_FullItem" VehicleItem="{Binding}"/>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<Border Grid.Column="0" BorderThickness="1" BorderBrush="Black">
<TextBlock Text="{Binding Path=Category}"/>
</Border>
<Border Grid.Column="1" BorderThickness="1" BorderBrush="Black">
<TextBlock Text="{Binding Item, Converter={StaticResource Item_to_FullItem}}"/>
</Border>
<Border Grid.Column="2" BorderThickness="1" BorderBrush="Black">
<TextBlock Text="{Binding Path=Weight}"/>
</Border>
</Grid>
</DataTemplate>