2

現在、私は値コンバーターを使用して、GUI用のユーザーフレンドリーな文字列を生成しています。例として、ステータスバーに使用可能なエンティティの数を表示するウィンドウがあります。ビューモデルには、呼び出し元のコードが設定できるint依存関係プロパティがあり、エンティティの数を表示するテキストボックスのバインディングで、int依存関係プロパティと"x"を"xエンティティに変更する値コンバーターを指定します。 "。

私のコードはこれらのコンバーターで散らかっていて、XAMLには迷惑なリソース宣言がたくさんありますが、GUI固有の文字列形式はすべてコンバーターで分離されており、呼び出し元のコードは分離されていないため、これらは気に入っています。心配する必要はありません。しかし、それでも、これがバリューコンバーターの目的ではないのではないかと思います。

4

3 に答える 3

2

設計された目的でvalueconverterを使用している場合は、「間違っている」わけではありません。個人的には、列挙値をわかりやすい文字列に変換するために使用しますが、文字列を値コンバーターにハードコーディングするのではなく、VCは列挙値を使用してリソースファイルから文字列を取得します。

あなたが言及する特定のケースでは、私はあなたが持っているVCの量を減らすために少し違ったやり方をします-あなたはたった1つでそれをすることができます。あなたがしているのは、値を既知の文字列に直接代入/挿入することです。使用可能なを使用して開始し、ConverterParameterそれを使用してリソースファイル内の文字列のIDを渡すことができます。その後、VCに渡された値を、VCによって指定された文字列に挿入できますConverterParameter。簡単な擬似コードの例を次に示します。

public class MyConverter : IValueConverter
{
    public MyConverter()
    {
        _rm = new ResourceManager("[my_assembly_name].Resources.strings", Assembly.GetExecutingAssembly());
    }

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (parameter is string && !string.IsNullOrEmpty((string)parameter))
        {
            string z = _rm.GetString((string)parameter);
            if (z != null)
            {
                return string.Format(z, value);
            }
        }

        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion

    ResourceManager _rm;
}

そして、このコンバーターは次のように使用します。

<TextBlock Text={Binding someNumericValue, Converter={StaticResource MyConverter}, ConverterParameter=[key_to_resource_string]} />

また、WPF4-IIRCを見てください。これには、バインディング式の一部としてフォーマット文字列を指定できる機能があります。これも役立つ場合があります。

于 2010-04-06T22:37:51.087 に答える
1

私は通常、ビューモデルでこの種の変換を行います。したがって、ビューモデルには、基になるint値を「装飾」する文字列依存関係プロパティがあります。

シナリオでint値がどのように更新されるかは質問から明らかではないため、適切なソリューションを選択する際の要因となる可能性があります。

これにビューモデルを使用すると、より表現力豊かなIMHOになります。表示されているものに直接バインドし、表示ロジック(私が考えると思います)は、コンバーターに埋め込まれていません。 XAML。

于 2010-04-06T22:14:57.457 に答える
1

@slugsterで説明したように、StringFormatプロパティBindingは.NET 3.5sp1以降で使用可能ですが、で指定できます。これは私が通常これらのタイプのフォーマットを指定する方法です:

<TextBlock Text="{Binding x, StringFormat={}{0} entities available.}" />

これにより、ViewModelsは表示に必要なデータのみを指定でき、ビューはデータを必要に応じて簡単にフォーマットできます。IMO、これはビューとビューモデルの間の最もクリーンな分離線です。

{}は、StringFormatプロパティの後の最初の要素であるため、{0}をエスケープする必要があることに注意してください。

于 2010-04-07T04:07:58.707 に答える