簡體   English   中英

如何通過ConverterParameter將TimeSpan.FromSeconds傳遞給轉換器?

[英]How can I pass TimeSpan.FromSeconds to a converter via the ConverterParameter?

鑒於以下內容:

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( );
    }
}

如何將TimeSpan.FromSeconds傳遞給ConverterParameter

我嘗試過以下但是沒有用 -

<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 lib:TimeSpan.FromSeconds}}" />
    </Viewbox>
</Window>

我在設計器中收到錯誤 - The member "FromSeconds" is not recognized or is not accessible 我已經檢查了TimeSpan結構,它包含在System命名空間中(在mscorlib程序集下),我曾經無數次使用.FromFOO進行轉換(只是不是這種方式)。

我知道我可以直接在轉換器中調用TimeSpan.FromSeconds ,但我希望能有更靈活的東西。

那么我正在嘗試做什么呢? 我該怎么做才能正確?

感謝有用的評論者,錯誤在於實施。 顯然,您不能隱式地將方法或函數名稱作為參數傳遞(至少不是從XAML中傳遞)。

為了避免這種情況,我更改了轉換器代碼,將TimeSpan.FromFOO函數公開為Func<double,TimeSpan>屬性,以便將它們傳遞給ConverterParameter -

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( );
    }
}

和窗口 -

<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傳遞的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM