我需要绑定到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,以便它可以正确格式化。
1条答案
按热度按时间eivgtgni1#
如果使用
<Label Text="{Binding BegTime, Converter={StaticResource FormatJobTimeBegTime}}"
,BegTime可以不带ConverterParameter传入Converters。当数据在单向或双向绑定中从源移动到目标时,将调用Convert方法。value参数是数据绑定源中的对象或值。
更多信息,你可以参考绑定值转换器
请看下面的代码,BegTime将传递给第一个value对象,而不是Jason提到的parameter对象。
这在我这边很有效。
顺便说一下,ConverterParameter不是BindableObject,所以不能对它使用绑定.
希望能成功。