C# 如何通过ConverterParameter将TimeSpan.FromSeconds传递给转换器?

C# 如何通过ConverterParameter将TimeSpan.FromSeconds传递给转换器?,c#,wpf,xaml,converter,func,C#,Wpf,Xaml,Converter,Func,鉴于以下情况: namespace Foo.Converters { public class TimespanConverter : IValueConverter { public object Convert( object value, Type targetType, object parameter, CultureInfo culture ) => ( parameter as Func<double, TimeSpan&

鉴于以下情况:

namespace Foo.Converters {
    public class TimespanConverter : IValueConverter {
        public object Convert( object value, Type targetType, object parameter, CultureInfo culture ) =>
            ( parameter as Func<double, TimeSpan> )?.Invoke( ( double )( value ) );
        public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture ) =>
            throw new NotImplementedException( );
    }
}
我在designer中遇到错误-
成员“FromSeconds”无法识别或无法访问
。我已经检查了TimeSpan结构,它包含在
系统
名称空间中(在
mscorlib
程序集下),过去我无数次使用
.FromFOO
进行转换(只是不是以这种方式)

我知道我可以直接在转换器中调用
TimeSpan.FromSeconds
,但我希望有更灵活的方法

那么我想做的是可能的吗?如何正确执行此操作?

解决方案 多亏了一位有帮助的评论者,实现中出现了错误。显然,您不能隐式地将方法或函数名作为参数传递(至少不能从XAML传递)

为了避免这种情况,我更改了转换器代码,将
TimeSpan.FromFOO
函数作为
Func
属性公开,以便将它们传递给转换器参数-

namespace Foo.Converters {
    public class TimespanConverter : IValueConverter {
        public static Func<double, TimeSpan> FromMilliseconds => TimeSpan.FromMilliseconds;
        public static Func<double, TimeSpan> FromSeconds => TimeSpan.FromSeconds;
        public static Func<double, TimeSpan> FromMinutes => TimeSpan.FromMinutes;
        public static Func<double, TimeSpan> FromHours => TimeSpan.FromHours;
        public static Func<double, TimeSpan> FromDays => TimeSpan.FromDays;

        public object Convert(
            object value, Type targetType, object parameter, CultureInfo culture ) =>
            ( parameter as Func<double, TimeSpan> )?.Invoke( ( double )( value ) );
        public object ConvertBack(
            object value, Type targetType, object parameter, CultureInfo culture ) =>
            throw new NotImplementedException( );
    }
}
名称空间Foo.Converters{
公共类时间转换器:IValueConverter{
public static Func frommilluses=>TimeSpan.frommilluses;
public static Func FromSeconds=>TimeSpan.FromSeconds;
public static Func FromMinutes=>TimeSpan.FromMinutes;
公共静态函数FromHours=>TimeSpan.FromHours;
public static Func FromDays=>TimeSpan.FromDays;
公共对象转换(
对象值、类型targetType、对象参数、文化信息文化)=>
(参数为Func)?.Invoke((double)(value));
公共对象转换回(
对象值、类型targetType、对象参数、文化信息文化)=>
抛出新的NotImplementedException();
}
}
窗户-

<Window
    x:Class="Foo.MyWindow"
    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"
    xmlns:c="clr-namespace:Foo.Converters"
    xmlns:lib="clr-namespace:System;assembly=mscorlib"
    xmlns:local="clr-namespace:Foo"
    mc:Ignorable="d" Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <c:TimespanConverter x:Key="TSC" />
    </Window.Resources>
    <Viewbox>
        <TextBlock Text="{Binding
            Seconds, Source={x:Static Application.Current},
            Converter={StaticResource TSC},
            ConverterParameter={x:Static c:TimespanConverter.FromSeconds}}" />
    </Viewbox>
</Window>


设计时错误已消失,但文本仍不显示。我不太担心实际显示的文本以及实现这一点的最佳方法,而这似乎是目前最好的选择。此外,它还可以扩展到希望将Func作为ConverterParameter传递的任何实例。

TimeSpan.FromSeconds是一种方法,绝对不是Func。。只需输入一个字符串,您的转换器将
打开并继续。Tch。可以这并不理想,也肯定不是我想要的,但我想更有效的解决方法是将
TimeSpan.FromFOO
方法作为func从转换器本身中公开,并将其作为转换器参数传递。好吧,其他方法,您可以自己创建。创建一个静态类型,该类型公开可以在静态绑定中使用的属性,该绑定将与您的值转换器一起工作……是的,通常当我与自己交谈时,我是唯一参与对话的人。请参阅编辑。我认为您应该将其发布为解决方案,而不是编辑,因为它是解决方案,并且最好具有for records.Application.Current没有名为Seconds的属性,我猜这就是为什么没有显示文本的原因。检查输出是否存在绑定错误。我不确定您希望从何处获取此秒值,但它不会在那里。如果我添加了属性,它会在那里。我没有发布那个代码,因为我希望有些东西是隐含的。
<Window
    x:Class="Foo.MyWindow"
    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"
    xmlns:c="clr-namespace:Foo.Converters"
    xmlns:lib="clr-namespace:System;assembly=mscorlib"
    xmlns:local="clr-namespace:Foo"
    mc:Ignorable="d" Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <c:TimespanConverter x:Key="TSC" />
    </Window.Resources>
    <Viewbox>
        <TextBlock Text="{Binding
            Seconds, Source={x:Static Application.Current},
            Converter={StaticResource TSC},
            ConverterParameter={x:Static c:TimespanConverter.FromSeconds}}" />
    </Viewbox>
</Window>