2011-12-08 15 views
3

私はMVVMをかなり新しくしています。この長さのリスト内の特定の要素にバインドされた各1とコレクション内の個々の要素へのバインド

ビューのための私のXAMLで
public List<float> Length 
{ 
    get; 
    set; 
} 

、私はいくつかのテキストボックスを持っている、::私はとてもとして実装パブリックプロパティを持つビューモデルクラスを持っている

<TextBox Text="{Binding Length[0], Converter=DimensionConverter}" /> 
    <TextBox Text="{Binding Length[2], Converter=DimensionConverter}" /> 
    <TextBox Text="{Binding Length[4], Converter=DimensionConverter}" /> 

DimensionConverterはIValueConverterの派生クラスで、ディメンションのような値をフォーマットします(つまり、画面上のテキストボックスで480.0インチがテキストボックスに40'0 "になります)。収量は420.0インチ)

私の問題:関連するTextBoxで変更されたリストの各値を検証できるようにする必要があります。入力値に応じてリスト内の他の値を変更する必要があります(長さ[0]の浮動小数点値を変更すると長さ[4]の値が変更され、画面が更新されます)。

インデクサーを許可するためにプロパティを再利用する方法はありますか?または、List内の各項目の個別のプロパティを作成する必要がありますか(本当にListを不要にします)?基本的に、私はすでにフロートのコレクションを持っているので、変更された各アイテムを検証するためのMVVMコードを書くことができるようにしたいと考えていました。

思考?

答えて

1

List<float>の代わりにObservableCollection<float>を使用し、CollectionChangedイベントを処理して、ユーザーが値を変更したときに検出することができます。

+0

アイテムインデックスで特定のリストアイテムにバインドできないことがわかっている限り、私は何かを見逃しましたか? – sll

+0

それは私が理解したものではありません。明らかにOPはユーザー入力を検証したいので、ユーザーが値を変更したときに検出する必要があります –

+0

質問が完全に間違っているようです。 – sll

1

思いません。このような何か:

<ItemsControl ItemsSource="{Binding Length}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <TextBox Text="{Binding Mode=TwoWay, Converter=DimensionConverter}" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

は、あなたが望むものに近いもの?
IValueConverterがConvertBackを実装している限り、一覧全体が表示され、ユーザーは値を変更できるようになります。値はリストにまっすぐ戻されます。

その後トーマスができればそれは素晴らしいことだ。..検証、またはあなたは、現時点ですでに汚れて見えないし、それがかろうじて数行のコードは何ObservableLinkedList

を実装するために

+0

私が持っている問題は、私は作成しようとしています。本質的にビューは建物レイアウトのため、長さアイテムは壁の長さ、さまざまな構成(長方形、L字型、T字型など)です。レイアウトはダイアグラムとして表示され、個々の測定値を入力するためにTextBoxコントロールが配置されています。私はすでに壁のリストを持っているので、コレクション内の各アイテムの定型メソッドを作成するのではなく、バインディングの中で単純にアクセスすることを望んでいました。 –

1

を言ってやりますINotifyPropertyChangedを実装するクラスがあり、リストの長さが一定であればプロパティを持つ。

+0

FYI:Lengthプロパティを提供するViewModelクラスは、INotifyPropertyChangedを実装しています –

1

あなたは、あなたはあなたがここにある。この

public class FloatClassViewmModel : INotifyPropertyChanged 
{ 
    public FloatClassViewmModel() { 
    this.FloatClassCollection = new ObservableCollection<FloatClass>(); 
    foreach (var floatValue in new[]{0f,1f,2f,3f}) { 
     this.FloatClassCollection.Add(new FloatClass(floatValue, this.FloatClassCollection)); 
    } 
    } 

    private ObservableCollection<FloatClass> floatClassCollection; 

    public ObservableCollection<FloatClass> FloatClassCollection { 
    get { return this.floatClassCollection; } 
    set { 
     if (!Equals(value, this.FloatClassCollection)) { 
     this.floatClassCollection = value; 
     this.RaiseOnPropertyChanged("FloatClassCollection"); 
     } 
    } 
    } 

    private void RaiseOnPropertyChanged(string propName) { 
    var eh = this.PropertyChanged; 
    if (eh != null) { 
     eh(this, new PropertyChangedEventArgs(propName)); 
    } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

のようなモデルを使用することができ、あなたのviewmodelであなたのviewmodel

public class FloatClass : INotifyPropertyChanged 
{ 
    private ICollection parentList; 

    public FloatClass(float initValue, ICollection pList) { 
    parentList = pList; 
    this.Value = initValue; 
    } 

    private float value; 

    public float Value { 
    get { return this.value; } 
    set { 
     if (!Equals(value, this.Value)) { 
     this.value = value; 
     this.RaiseOnPropertyChanged("Value"); 
     } 
    } 
    } 

    private void RaiseOnPropertyChanged(string propName) { 
    var eh = this.PropertyChanged; 
    if (eh != null) { 
     eh(this, new PropertyChangedEventArgs(propName)); 
    } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

でyouseできるモデルを作成MVVMを使用してテキスト入力を検証したい場合は、 xamlの例

<ItemsControl ItemsSource="{Binding Path=FloatClassViewmModel.FloatClassCollection}"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <TextBox Text="{Binding Value, Mode=TwoWay, Converter=DimensionConverter}" /> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

これが役に立ちます

+0

私はこのアプローチについて考えました。私は "plumbing heavy"と思われるので、私は躊躇しますが、私はMVVMをかなり新しくしているので、おそらくC++の時代から残っているかもしれません。 –

関連する問題