2017-02-18 9 views
0

ボタンを押したときにチェックボックスがオンになっているかどうかによって、リストボックスに表示する単純な文字列のリストがあります。私は、ボタンのリスナーにこのロジックを持っている:リストボックス内のアイテムが不規則に更新されるWPF

private void fileSavePerms_Click(object sender, RoutedEventArgs e) 
{ 
    foreach (CheckBox checkbox in checkboxList) 
    { 
     if (checkbox.IsChecked == true && !permissionList.Contains(checkbox.Name)) 
     { 
      permissionList.Add(checkbox.Name); 
     } 

     else if (checkbox.IsChecked == false && permissionList.Contains(checkbox.Name)) 
     { 
      permissionList.Remove(checkbox.Name); 
     } 
    } 
    permListBox.ItemsSource = permissionList; 
} 

は、私の知る限りでは、これはあなたがボタンをクリックしたときに、非常に単純なデータバインドを行うことができる方法です。しかし、リストボックスは意図したとおりに初めて更新されますが、リストの誤った内容で更新され、ボックスにデータを挿入しようとしています。私は出力と識別可能なパターンを見ることができません。

さらに、しばらくの間(数回のボタンクリック)、「an ItemsControl is inconsistent with its items source」という例外が発生します。

私のバインディングを正しく設定していないか、ItemsControlを間違った時間に割り当てていますか?

更新:

リストボックスのXAML:

<ListBox x:Name="permListBox" ItemsSource="{Binding permissionList}" HorizontalAlignment="Left" Height="36" Margin="28,512,0,0" VerticalAlignment="Top" Width="442"/>

+0

このリストボックスに対応するXAMLも共有できますか? –

+0

@DaveSリストボックスのXAMLを追加しました。ありがとうございました – James

答えて

2

あなたがコントロールにのみプロパティをバインドすることができ、すべての最初の。フィールドはバインドできません。したがって、permissionListは、Window.DataContextプロパティに設定したDataContextオブジェクトのプロパティである必要があります。

これが正しく設定されている場合、毎回新しいList<string>を作成し、それをコントロールにバインドされたプロパティに割り当てることができます。コントロールのItemsSourceプロパティに割り当てる必要はありません

ウィンドウのデータコンテキストがウィンドウ自体に設定されているとします。 XAMLファイルで

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     this.DataContext = this; 
    } 

    public List<string> PermissionList 
    { 
     get { return (List<string>)GetValue(PermissionListProperty); } 
     set { SetValue(PermissionListProperty, value); } 
    } 

    public static readonly DependencyProperty PermissionListProperty = 
     DependencyProperty.Register(
      "PermissionList", 
      typeof(List<string>), 
      typeof(MainWindow), 
      new PropertyMetadata(new List<string>()) 
     ); 

    private void fileSavePerms_Click(object sender, RoutedEventArgs e) 
    { 
     // You create a new instance of List<string> 
     var newPermissionList = new List<string>(); 

     // your foreach statement that fills this newPermissionList 
     // ... 

     // At the end you simply replace the property value with this new list 
     PermissionList = newPermissionList; 
    } 
} 

あなたはこの必要があります。このソリューションを向上させることができる。もちろん、

<ListBox 
    ItemsSource="{Binding PermissionList}" 
    HorizontalAlignment="Left" 
    VerticalAlignment="Top" 
    Margin="28,512,0,0" 
    Height="36" 
    Width="442"/> 

を。あなたは、もはやList<string>のたびに新しいインスタンスを作成する必要がありませんが、あなたはリストをクリアし、あなたのforeach文で新しいアイテムを追加できるように

  • あなたはSystem.Collections.ObjectModel.ObservableCollection<string>タイプを使用することができます。
  • このアクセス許可リストを持つViewModelクラス(例:MainViewModel)を使用し、INotifyPropertyChangedインターフェイスも実装し、このクラスのインスタンスをWPFウィンドウのDataContextプロパティに設定することができます。
+0

DependencyPropertysを見ていただきありがとうございます。また、上記の解決方法について言及する価値は、XAMLバインディングは '{バインディングPermissionList}' – James

+0

に設定する必要があります。しかし、多くの感謝。 – James

関連する問題