我有一个在MonkeyViewModel中定义的方法DateTime TimestampToDatetime(long Timestamp) (return new DateTime(Timestamp))

以及作为Monkey模型中定义的时间戳的变量long DateModified.

在XAML中,我希望时间戳显示为DateTime字符串,例如,Long DateModified 1685299649000显示为字符串DateTime May 28, 2023

我怎么才能做TimestampToDatetime(DateModified).toString()这样的事呢?

换句话说,是否可以将两个属性绑定到同一标记和同一绑定属性中,并将其中一个属性作为参数传递给另一个属性?

是否有类似如下的语法:

<Label Text="{
Binding TimestampToDatetime, x:Type ViewModel: MonkeyViewModel
    ({
        Binding DateModified, x:Type model:Mondey
    }).tostring()
}">

推荐答案

Remark: Generally, it's recommended to store dates as 100 objects and not as other data types. You should use what's already there.

如果您不能或不想更改变量类型,则至少需要将其转换为属性.如果该值可能发生变化,则需要通过手动实现INotifyPropertyChanged接口或使用MVVM Community Toolkit‘S源生成器来使其可观察:

[ObservableProperty]
private long dateModified;

这将自动为您生成一个名为DateModifiedpublic属性(请注意符号名称的小写和大写字母的差异),在引擎盖下看起来如下所示:

private long dateModified;
public long DateModified
{
    get => dateModified;
    set
    {
        if(dateModified.Equals(value) return;
        dateModified = value;
        OnPropertyChanged();
    }
}

You can find more information about Source Generators on my 100.

然后,您可以实现将long转换为DateTimevalue converter,例如:

public class LongToDateTimeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if(value is long ticks)
        {
            return DateTime.FromTicks(ticks);
        }
        // Fallback value, could also be something else
        return DateTime.MinValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

一百零二

然后,可以在XAML中使用此转换器将DateModified属性转换为DateTime对象,然后在绑定表达式中指定字符串格式:

<ContentPage.Resources>
    <ResourceDictionary>
        <converters:LongToDateTimeConverter x:Key="LongToDateConverter" />
    </ResourceDictionary>
</ContentPage.Resources>

<VerticalStackLayout>
    <Label
        Text="{Binding DateModified, Converter={StaticResource LongToDateConverter}, StringFormat='{0:M}, {0:yyyy}'}"/>
</VerticalStackLayout>

你可能需要try string format,直到你得到你需要的东西.有一份standard date and time formats人的大名单.如果我没记错的话,StringFormat='{0:M}, {0:yyyy}'}应该产生类似May 28, 2023的结果.

有几种其他方法可以做到这一点,例如,您也可以将属性转换为string属性并绑定到该属性,或者更改转换器以生成已格式化的string.但是,我建议使用上面的解决方案,因为它在字符串格式方面提供了更多的灵活性.在XAML中更改更容易,您甚至可以 for each 地区提供不同的格式,并且可以在绑定到相同属性的同时对不同的标签使用不同的格式.

Csharp相关问答推荐

Blazor:子编辑表单上的嵌套编辑表单验证

将多个enum值传递给MAUI中的转换器参数的XML语法是什么?

等待限制选项似乎不适用于频道

有没有一种方法可以防止在编译时在MicrosoftC或非单线程上下文中调用方法?

有没有一种方法可以在包含混合文本的标签中嵌入超链接?

并行令牌更新

如何告诉自己创建的NuGet包在应用程序中发生了变化?

是否可以使用EF—Core进行临时部分更新?

如果存在对CodeAnalysis.CSharp的引用,则不能引用netStandard2.0库

Nuget包Serilog.Sinks.AwsCloudwatch引发TypeLoadExceptions,因为父类型是密封的

如何使用自定义负载均衡器管理Ocelot负载均衡器中的多线程和批读取

C#DateTime.ParseExact不使用特定日期

将字节转换为 struct 并返回

交替的奇数

异步任务调用程序集

.NET 6:如何防止系统生成的日志(log)?

当空判断结果赋给变量时,为什么会出现可能空异常警告的解引用?

当try 测试具有协变返回类型的抽象属性时,类似功能引发System.ArgumentException

try 访问字典中的模拟对象时引发KeyNotFoundException

为什么连接到Google OAuth2后,结果.Credential为空?