3

この件に関する質問がないことは、ここでコードの臭いを示している可能性がありますが、... クラスの拡張メソッドを作成し、プロパティのようにデータバインドすることは可能ですか?

基本的に変更できないクラス構造が提供されていることを前提としていますが、表示目的で一連のブール値プロパティを文字列として表現したいと考えています。

単純化された基本クラス:

public class Transmission
{
    public int ID { get; set; }
    public bool Cancelled { get; set; }
    public bool Stored { get; set; }
    public bool Recorded { get; set; }
}

私の拡張方法:

public static class Extensions
{
    public static string Status(this Transmission trans)
    {
        StringBuilder sb = new StringBuilder("|");
        if (trans.Cancelled)
            sb.Append("| Cancelled ");
        if (trans.Recorded)
            sb.Append("| Recorded ");
        if (trans.Stored)
            sb.Append("| Stored ");
        sb.Append("||");

        return sb.ToString();
    }
}

さらに複雑にするために、これらのリストを渡され、データグリッドにバインドしようとしています (XAML の経験が大幅に制限されています)。

<GroupBox Header="Here is an amazing list of results for you to violate horribly.">
    <DataGrid ItemsSource="{Binding Transmissions, Mode=OneWay}" AutoGenerateColumns="False">
         <DataGrid.Columns>
            <DataGridTextColumn Width="*" Header="Local ID" Binding="{Binding ID, Mode=OneWay}"/>
            <DataGridTextColumn Width="*" Header="Status" Binding="{Binding Status, Mode=OneWay}"/>
         </DataGrid.Columns>
    </DataGrid>
</GroupBox>

コードをテストしたところ、問題なく ID にバインドできました。ただし、「ステータス」はまったく取得されていません。拡張プロパティにバインドするトリックはありますか? それとも、デコレータ/ファサードクラスを作成してそれにバインドする方が賢明でしょうか?

4

2 に答える 2

6

これが、 MVVMのようなパターンを通常使用するものです。モデルに基づいており、ビューにのみ関連するプロパティをビューモデルに追加します。ビューモデルには、モデルへの参照を含めて、そのプロパティに直接バインドするか、ビューモデルにミラーリングすることができます (デカップリングの場合は後者を選択します)。

于 2013-07-18T22:58:16.250 に答える