C# 具有相关属性的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"

我有一个UWP项目,我正试图在我的
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>