UWP允许您绑定到静态方法。我试图通过
来获取时间字符串<TextBlock Text={x:Bind MyDateTime.ToString(MyPatternString)} />
其中MyPatternString
是&#34; h:mm tt&#34;。
问题在于DateTime
ToString()
方法有几种不同的签名。第一个收到IFormatProvider
。因此,我收到了构建错误:
功能参数&#39;提供商&#39;无效或不匹配
有没有办法告诉它我希望使用接受字符串的签名?我以为它会自动知道这一点。
答案 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