2017-02-20 5 views
1

UWPを使用すると、静的メソッドにバインドできます。 「:ミリメートルTT hは」私はMyPatternStringがあるx:Bindの使用時に署名を指定します。

<TextBlock Text={x:Bind MyDateTime.ToString(MyPatternString)} /> 

を使用して時刻の文字列を取得しようとしています。

DateTimeToString()メソッドにはいくつかの異なるシグネチャがあります。最初のものはIFormatProviderを受け取ります。このため、ビルドエラーが発生します。

​​

文字列を受け入れる署名を使用する方法はありますか?私はそれが自動的にこれを知っていると思っていただろう。

+0

はあなただけ(CultureInfo.Invariantのような程度)するIFormatProviderを挿入することはできませんか?それ以外の場合は、独自の変換メソッドを作成して呼び出します。 –

答えて

2

にコンバータを指定することができます!

あなたのバインディング式はこれに変更することができますこの方法:

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

は、これが唯一のWindows 10周年記念アップデートで動作することをお勧めすること!この問題の詳細情報here

+1

Hm。これは私が得ることができる最も近いように見えます。これをやらなければならないのは依然として不器用だと感じますが、何よりも優れています。 – RareNCool

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

ページ上のリソースとしてそれを登録して、あなたがちょうどあなたのViewModelにメソッドを追加し、代わりにそれを使用することができます結合

<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

+1

私は何をしようとしているのかを達成するためにコンバータを使用する方法を知っています。私の質問は、より好奇心の質問です。署名を指定する方法があるようです。 – RareNCool

+1

コンバーターを避けることは、x:バインドの目的の1つです。 –

0

自分自身で答えを探した後であなたの質問を見つけました。どこにでも投稿された多くのヘルプが見つかりませんでしたが、いくつかの試行錯誤の後にそれを把握しました。

Function parameter 'provider' is invalid or mismatched

XAMLに、特定の過負荷が(文字列、するIFormatProvider)をDateTimeProperty.ToStringされて呼び出されていることがその理由。

私の場合、私が表示する値はユーザーコントロール内にあるので、それぞれに対して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に必要なローカル・インスタンスを作成する:バインドは、静的プロパティを使用した場合にエラーが発生コンパイル。

とXAML:。また、フォーマットが「で囲まれて 'とされていません

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

お知らせ

、これが唯一のxのモードとして、一度更新します:バインドモード=ワンタイムのデフォルトを持っています; 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} /> 
関連する問題