使用x时指定签名:绑定

时间:2017-02-20 13:53:28

标签: xaml uwp xbind

UWP允许您绑定到静态方法。我试图通过

来获取时间字符串
<TextBlock Text={x:Bind MyDateTime.ToString(MyPatternString)} />

其中MyPatternString是&#34; h:mm tt&#34;。

问题在于DateTime ToString()方法有几种不同的签名。第一个收到IFormatProvider。因此,我收到了构建错误:

  

功能参数&#39;提供商&#39;无效或不匹配

有没有办法告诉它我希望使用接受字符串的签名?我以为它会自动知道这一点。

3 个答案:

答案 0 :(得分:2)

您只需向ViewModel添加一个方法,然后再使用它!

这样你的绑定表达式可以改为:

<TextBlock Text={x:Bind FormatDateToString(MyDateTime)} />

请注意,这仅适用于Windows 10周年更新!有关此问题的更多信息here

答案 1 :(得分:0)

自己寻找答案后找到你的问题;没有在任何地方找到很多帮助,但在经过一些试验和错误后确实找到了它。

  

功能参数&#39;提供商&#39;无效或不匹配

原因是在XAML中,正在调用一个特定的重载,它是DateTimeProperty.ToString(string,IFormatProvider)。

在我的情况下,我显示的任何值都在用户控件中,因此对于每个我添加了一个CultureInfo依赖项属性并将其绑定到我的视图模型上的公共源。

如果是C#,请添加:

using System.Globalization;

然后

public static readonly DependencyProperty CultureInfoProperty = DependencyProperty.Register(
        "CultureInfo", typeof(CultureInfo), typeof(XyzReadoutView), new PropertyMetadata(default(CultureInfo)));

    public CultureInfo CultureInfo
    {
        get { return (CultureInfo) GetValue(CultureInfoProperty); }
        set { SetValue(CultureInfoProperty, value); }
    }

这将创建x:Bind所需的本​​地实例,如果使用静态属性,则会发生编译错误。

和XAML:

<TextBlock Text={x:Bind MyDateTime.ToString('h:mm tt', CultureInfo)} />

请注意,格式周围有&#39;而不是&#34;。

此外,这只会更新一次,因为x:Bind的模式默认为Mode = OneTime;如果您希望DateTime或CultureInfo上的更改传播,则必须将模式更改为Mode = OneWay。

<TextBlock Text={x:Bind MyDateTime.ToString('h:mm tt', CultureInfo), Mode=OneWay} />

如果格式是用户可更改的,我会为它创建一个依赖属性,以及更新和轻松控制绑定回视图模型,但这只是我个人的偏好。

public static readonly DependencyProperty DateTimeFormatProperty = DependencyProperty.Register(
        "DateTimeFormat", typeof(string), typeof(XyzReadoutView), new PropertyMetadata(default(string)));

    public string DateTimeFormat
    {
        get { return (string) GetValue(DateTimeFormatProperty); }
        set { SetValue(DateTimeFormatProperty, value); }
    }

和XAML:

<TextBlock Text={x:Bind MyDateTime.ToString(DateTimeFormat, CultureInfo), Mode=OneWay} />

答案 2 :(得分:-1)

您需要使用IValueConverter格式化文本以进行显示。创建一个继承自IValueConverter的类。

public class DateFormatter : IValueConverter
{
    // This converts the DateTime object to the string to display.
    public object Convert(object value, Type targetType, 
        object parameter, string language)
    {
        // Retrieve the format string and use it to format the value.
        string formatString = parameter as string;
        if (!string.IsNullOrEmpty(formatString))
        {
            return string.Format(
                new CultureInfo(language), formatString, value);
        }
        // If the format string is null or empty, simply call ToString()
        // on the value.
        return value.ToString();
    }

    // No need to implement converting back on a one-way binding 
    public object ConvertBack(object value, Type targetType, 
        object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

在页面上将其注册为资源,然后您可以在绑定中指定转换器

<TextBlock Text={x:Bind MyDateTime, Converter={StaticResource DateFormatConverter}}, ConverterParameter="mm/dd/yyyy"}"/>

https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Xaml.Data.IValueConverter