2011-11-10 10 views
1

私はリストボックスを銀色にしています。ユーザーが何をしているのかを検証し、現在のアイテムが有効でない場合は、別のアイテムを選択しないようにします。これは、リストボックスで選択したアイテムに対応する編集ウィンドウ内の他のフィールドを表示しているためです。アイテムを停止するリストボックスで選択中

どうすればいいですか?これは、

<ListBox SelectedItem="{Binding SelectedTemplate, Mode=TwoWay}" /> 
</ListBox> 

のviewmodelは次のようになり、私が現在持っているもの

public EmailTemplateEntity SelectedTemplate 
    { 
     get { return selectedTemplate; } 
     set 
     { 
      if (not valid) 
      { 
       RaisePropertyChanged(this, x => x.SelectedTemplate); // to reset it to the previous value 
      } 
      else 
      { 
       selectedTemplate = value; 
      } 
     } 
    } 

である。しかし、それは動作しません。 getterは、有効でないコードにドロップされた場合に呼び出されますが、選択した項目は前の項目ではなく選択した項目です。

UPDATE:

だからここに私は、

私はアイテムのTest1を選択するだけを許可するように期待
public class ViewModel : INotifyPropertyChanged 
{ 
    public string SelectedItem 
    { 
     get 
     { 
      return "Test1"; 
     } 
     set 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs("SelectedItem")); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

<ListBox SelectedValuePath="Content" SelectedValue="{Binding SelectedItem, Mode=TwoWay}"> 
     <ListBoxItem>Test</ListBoxItem> 
     <ListBoxItem>Test1</ListBoxItem> 
     <ListBoxItem>Test2</ListBoxItem> 
     <ListBoxItem>Test3</ListBoxItem> 
     <ListBoxItem>Test4</ListBoxItem> 
</ListBox> 

とのviewmodelをWPFアプリを書かれていますしかし、それは同じことをします。

私はアイテムをviewmodelの文字列リストにして、itemssourceをそのリストにバインドする場合も同様です。

スヌープを使用すると、問題のヒントが得られます。 SelectedValueは正しく設定されていますが、コントロールには「SelectedItems」というリストがあり、これは正しく設定されていません。これは読み取り専用フィールドです。

答えて

0

「注文」問題のタイミング問題である必要があります。私はこれを行う場合は、背後にあるコードで

<ListBox Name="ListBox" SelectedValuePath="Content" ItemsSource="{Binding Items}" SelectionChanged="ListBox_SelectionChanged"> 
</ListBox> 

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    ListBox.SelectedItem = "Item2"; 
} 

は、その後、それは動作します。 ListBox_SelectionChangedイベントは、SelectedValueにバインドする場合、ViewModelのセッターとゲッターの後で発生します。それは、それがやろうとしている他のすべての内部的な事柄をすべて完了した後、SelectedItemを最後に設定することに関連していなければなりません。

1

バッキングフィールドに値を設定する前に検証を追加してから、UIに変更を通知する必要があります。

public EmailTemplateEntity SelectedTemplate 
{ 
    get { return selectedTemplate; } 
    set 
    { 
     // if value is valid then assign the value to your backing field. 
     if (IsValid(value)) 
     { 
      selectedTemplate = value; 
     } 

     // notify changed back to UI, if value is value new selected value is apply, if value is invalid then the value of your backing field is not change and old value is notify to UI. 
     RaisePropertyChanged(this, x => x.SelectedTemplate); 
    } 
} 

private bool IsValue(EmailTemplateEntity entity) 
{ 
    // do validation here. 
} 
+0

ありがとうございました。私は私の質問で私のコードを簡素化しようとしていた。どちらの場合でもプロパティを変更することを含めて、あなたが持っているものとほぼ同等です。私は少しそれを変更し、あなたが提案するものは動作していません。これには何かもっと間違ったことがなければなりません。私は、新しいVSプロジェクトを開始し、問題をより詳細に分離しようとするかもしれません。 – peter

関連する問題