2

MVVMパターンを使用してWPFアプリケーションを構築するときに、依存関係プロパティをどこに配置するかについて混乱しています。それはモデルまたはビューモデルに含まれますか?

編集

初期の回答(ありがとう)を見た後、私はまだ混乱していることに気付いたので、誰かが私にこれを説明するのを助けるために、私はより詳細を与えています。

ステーションというクラスがあります。測量技師や土木技師が道路沿いの長さを表すために使用します。ほとんどの場合、ステーションは2つだけですが、いくつかの装飾があります。まず、フォーマットが異なります。距離が100フィートを超える場合は、フォーマットする別の方法として+記号を追加します。したがって、1234.56フィート先には、ステーション12+34.56がある可能性があります。(これは私のポイントには十分なので、他の装飾はスキップします。)

したがって、特別なフォーマットのロジックは、モデルのクラスであるStationにあります。ビューのTextBoxで1234.56のユーザー入力を受け取り、それを「12+34.56」のテキスト値に強制変換したいと思います。したがって、TextBoxでユーザーにモデル内の値へのアクセスを許可する必要があるため、依存関係プロパティである必要があります。(それは正しいですよね?)しかし、TextBoxとStationの間を行き来する方法を強制/解析/理解するためのビジネスロジックは、Stationクラスに存在する必要があります。(右?)

さらに、後でユーザーが道路の図をクリックして駅の値を設定できるようにします。これには、マウスの移動に応じて値を動的に更新したり、データポイントを発行したときに値をロックしたりすることが含まれます。(これで、なぜ私がこれを簡潔にしようとしたのかがわかります。)

それで、これは、特に動的データポイントが後で関与する可能性がある場合に、依存関係プロパティを作成したいものではありませんか?そうでない場合、MVVMを使用してテキストボックスアイテムをステーションにフックするにはどうすればよいですか?(私は質問をする前にこれを本当にたくさん研究しましたが、成功しませんでした。)

  • ポール
4

2 に答える 2

3

通常、ViewModelとModelのどちらでも依存関係プロパティを使用することはありません。

依存関係プロパティは、実際にはビュー関連の機能のみを対象としています。ビューのDPをViewModelにバインドします。これにより、代わりにが実装されINotifyPropertyChangedます。

DPをViewModelまたはモデル自体に配置すると、ユーザーインターフェイステクノロジ(WPF)がモデルまたはアプリケーション固有のタイプに結合されるため、実際にはMVVMの主な目標の1つに違反します。

于 2012-09-03T23:05:47.793 に答える
2

MVVMでは、INotifyPropertyChangedDependencyPropertiesよりもプロパティを優先します。

クラスは。Stationを使用してプロパティを実装する必要がありますINotifyPropertyChanged。バインディングTextBoxでは、コンバーターを使用して、必要な形式で値を表示および読み取る必要があります。

public class Station : INotifyPropertyChanged
{
    private decimal _value;
    public decimal Value
    {
        get { return _value; }
        set
        {
            if (_value == value) return;

            _value = value;
            NotifyPropertyChanged("Value");
        }
    }
    /* INotifyPropertyChanged implementation */
}

public class StationConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string formattedValue = // Add the plus here
        return formattedValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string numericValue = // Parse the optional '+' out of the value
        decimal stationValue = decimal.Parse(numericValue);
    }
}

XAML:

<UserControl.Resources>
    <StationConverter Key="StationConverter" />
    <TheViewModel Key="TheVM" />
<UserControl.Resources>

<TextBox Text="{Binding Path=Station.Value, Source={StaticResource TheVM}, Converter={StaticResource StationConverter}, Mode=TwoWay}"/>
于 2012-09-04T00:06:33.550 に答える