如何将Maui XAML绑定值发送到代码隐藏C#转换器中的参数?

lmyy7pcs  于 2023-04-27  发布在  C#
关注(0)|答案(1)|浏览(170)

我需要绑定到Maui XAML中的几个自定义转换器,这些转换器只是以非常复杂的方式格式化字符串。
我在C#代码隐藏中创建了一个测试转换器,可以看到它被调用,但我无法获得包含BegTime中的Value的参数,只能是字符串或路径?
我的转换器被调用,但参数是Never实际的绑定值。
我可以给转换器发送一个固定的字符串“BegTime”(不是BegTime的值)

<Label Text="{Binding BegTime, 
    Converter={StaticResource FormatJobTimeBegTime},
    ConverterParameter=BegTime}" />

我可以给它发送一个((Microsoft.Maui.Controls.Binding)参数).Path包含'BegTime'(但不是BegTime的值)。

<Label Text="{Binding BegTime, 
    Converter={StaticResource FormatJobTimeBegTime},
    ConverterParameter={Binding BegTime}}" />

但是我似乎不能将BegTime内部的实际数据(包含时间的字符串)发送给参数??
下面是代码隐藏转换器的XAML声明:

<ContentPage.Resources>
    <ResourceDictionary>
        <converters:FormatJobTimeBegTimeConverter x:Key="FormatJobTimeBegTime" />
    </ResourceDictionary>
</ContentPage.Resources>

和FormatJobTimeBegTimeConverter正在被调用,因为我可以设置断点并观察参数

public class FormatJobTimeBegTimeConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        // I can set a breakpoint here to inspect the value of the parameter
        //parameter must contain a string with the value Inside BegTime???

        return "mm/dd/yy";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
         throw new NotImplementedException();
    }
}

BegTime是类中的一个属性:

public sealed partial class TicketItem: ObservableObject {
    [ObservableProperty]
    public DateTime begTime; 
    [ObservableProperty]
    public DateTime endTime; 
 }
public sealed partial class WhereSchedClient : ObservableObject {
    [ObservableProperty]
    public string company; 

    [ObservableProperty]
    public List<TicketItem> ticketItems;
 }
public class InvoiceViewModel  {
    public List<WhereSchedClient> WhereSchedClients { get; set; }
}

在XAML中显示时间完全没有问题,就像:

<Label Text="{Binding BegTime}" />

下面是XAML,它可以完美地工作

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage x:Name="parentView"
             xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:converters="clr-namespace:MauiSched"
             xmlns:viewModels="clr-namespace:MauiSched"
             x:Class="MauiSched.Schedule"
             Title="Schedule">
    <ContentPage.Resources>
        <ResourceDictionary>
            <converters:FormatJobTimeBegTimeConverter x:Key="FormatJobTimeBegTime" />
        </ResourceDictionary>
    </ContentPage.Resources>

    <ScrollView>
        <StackLayout>
            <!-- Header section -->
            <CollectionView ItemsSource="{Binding WhereSchedClients}" BackgroundColor="Blue">
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <StackLayout>
                            <Label Text="{Binding Company}" />
                            <!-- Invoice items section -->
                            <StackLayout BackgroundColor="Green">
                                <StackLayout BindableLayout.ItemsSource="{Binding TicketItems}">
                                    <BindableLayout.ItemTemplate>
                                        <DataTemplate>
                                            <StackLayout Orientation="Horizontal" Spacing="20">
                                                <Label Text="{Binding BegTime, 
                                                    Converter={StaticResource FormatJobTimeBegTime},
                                                    ConverterParameter={Binding BegTime}}" />
                                                <Label Text="{Binding BegTime}" />          
                                            </StackLayout>
                                        </DataTemplate>
                                    </BindableLayout.ItemTemplate>
                                </StackLayout>
                            </StackLayout>
                        </StackLayout>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>
        </StackLayout>
    </ScrollView>
</ContentPage>

我遇到的麻烦是将BegTime中的Value(日期字符串)作为参数传递给FormatJobTimeBegTimeConverter,以便它可以正确格式化。

eivgtgni

eivgtgni1#

如果使用<Label Text="{Binding BegTime, Converter={StaticResource FormatJobTimeBegTime}}"BegTime可以不带ConverterParameter传入Converters。
当数据在单向或双向绑定中从源移动到目标时,将调用Convert方法。value参数是数据绑定源中的对象或值。
更多信息,你可以参考绑定值转换器
请看下面的代码,BegTime将传递给第一个value对象,而不是Jason提到的parameter对象。

public class FormatJobTimeBegTimeConverter : IValueConverter
{
    public FormatJobTimeBegTimeConverter()
    {
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        DateTime dt = (DateTime)value;
        return string.Format("{0}/{1}/{2}",dt.Month,dt.Day,dt.Year);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

这在我这边很有效。
顺便说一下,ConverterParameter不是BindableObject,所以不能对它使用绑定.
希望能成功。

相关问题