2017-02-18 12 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 в неправильное время?

Update:

Часть 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 должен быть объектом объекта DataContext, который вы установили в свой Window.DataContext.

Если это правильно, вы можете создать новый List<string> каждый раз, а затем назначить ему свойство, связанное с элементом управления. Вам не нужно назначать его для свойства ItemsSource элемента управления

Скажем, контекст данных вашего окна установлен на самое окно.

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; 
    } 
} 

В XAML файл, который вы будете иметь это:

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

Конечно, это решение может быть улучшено.

  • Вы можете использовать System.Collections.ObjectModel.ObservableCollection<string> типа, так что вам больше не нужно создавать новый экземпляр List<string> каждый раз, но вы можете очистить список и добавить новые элементы в вашем foreach заявлении.
  • Вы можете использовать класс ViewModel (например, MainViewModel), который имеет этот список разрешений, а также реализует интерфейс INotifyPropertyChanged, а затем вы устанавливаете экземпляр этого класса в свойство вашего окна WPF DataContext.
+0

Работая отлично, спасибо вам большое, глядя в DependencyPropertys также, кажется полезным инструментом. Также стоит упомянуть, что для вашего вышеупомянутого решения привязка XAML должна быть установлена ​​в '{Binding PermissionList}' – James

+0

, а вы меня избили. Большое спасибо. – James