Как привязать список пользовательских объектов в качестве источника к списку?

1

Я привязываю, чтобы привязать список пользовательских объектов как источник к списку, в котором у моего списка есть пользовательский шаблон как

    <DataTemplate x:Key="UserTemplate1" >
      <StackPanel Orientation="Horizontal">
        <TextBlock  Name="vmname" Text="{Binding }" Width="100"/>
        <CheckBox Name="cb" IsChecked="{Binding ischeck}"/>
       </StackPanel>
    </DataTemplate>

и я использовал этот шаблон как тип данных для списка

      <ListBox Name="listbox3" Visibility="Hidden" Height="134" Width="156" Margin="515,82,62,104" IsSynchronizedWithCurrentItem="True" ItemTemplate="{StaticResource UserTemplate1}"  />

У меня есть список объектов пользовательского типа данных

    class item{
         string name;
         bool val; 
         } 

Я не могу связать этот список со списком. Я хочу связать список таким образом, что всякий раз, когда в списке отображается изменение, они должны отражать в списке объектов (item).

       listbox3.itemsource = list_items

Это не работает для меня

Здесь я не могу связать listbox3 со списком объектов класса checkvm.

  • 0
    Ваш пример кода вообще не показывает настройку listBox3.ItemsSource для вашей статической коллекции. Вместо этого я вижу, что вы просматриваете свою коллекцию и добавляете каждый элемент в listBox3.Items отдельности. Эти два действия не совпадают. Мне нравится писать в блоге темы для начинающих по WPF, и я настоятельно рекомендую вам прочитать ссылки в этом ответе, чтобы узнать, как работает система связывания WPF, что такое DataContext и как разрабатывать приложение WPF с использованием дизайна MVVM. шаблон. Удачи :)
  • 0
    Но чтобы прояснить разницу, установка ItemsSource означает «при загрузке выполните цикл по каждому элементу в коллекции и создайте <ListBoxItem> для каждого объекта, а затем установите ListBoxItem.DataContext для самого объекта». Если привязка к ObservableCollection , то каждый раз, когда элемент добавляется или удаляется из коллекции, ListBox будет повторно оценивать элементы, чтобы увидеть, какие элементы были добавлены или удалены, и соответствующим образом обновит интерфейс.
Теги:
wpf
listbox

2 ответа

1
Лучший ответ

Проблема заключается в том, что изменения (которые отражены в экземпляре класса элементов) не отражаются автоматически в другом представлении/привязке к элементу списка. Если вы хотите уведомить второе представление о том, что свойство экземпляра item было изменено, ему необходимо реализовать INotifyPropertyChanged. Самый простой способ - использовать MVVM-структуру. Ваш класс должен расширить класс ViewModel, который реализует уведомление об изменении.

пример:

public class Item : ViewModelBase
{

    private string _Name;
    public string Name
    {
        get
        {
            return _Name;
        }
        set
        {
            if (_Name != value)
            {
                _Name = value;
                RaisePropertyChanged(() => this.Name);
            }
        }
    }

    private bool _IsSelected;
    public bool IsSelected
    {
        get
        {
            return _IsSelected;
        }
        set
        {
            if (_IsSelected != value)
            {
                _IsSelected = value;
                RaisePropertyChanged(() => this.IsSelected);
            }
        }
    }
}
1

Вы привязываете свой CheckBox.Checked Проверено на "ischeck", однако ваш класс item не содержит свойство ischeck.

Для привязки к списку таких элементов:

class item{
     string name;
     bool val; 
     } 

Ваши привязки DataTemplate должны выглядеть так:

<DataTemplate x:Key="UserTemplate1" >
  <StackPanel Orientation="Horizontal">
    <TextBlock  Name="vmname" Text="{Binding name}" Width="100"/>
    <CheckBox Name="cb" IsChecked="{Binding val}"/>
   </StackPanel>
</DataTemplate>

Также обратите внимание, что ваш класс должен реализовать INotifyPropertyChanged если вы хотите иметь возможность изменять свой элемент в коде позади и автоматически обновлять пользовательский интерфейс, или если вы хотите сделать любое уведомление об изменении.

В качестве примечания, я ненавижу ваше (отсутствие) соглашения об именах. Я очень рекомендую googling стандартное соглашение об именовании.Net и его использование. :)

  • 0
    извините за это .. я определенно буду работать над этими соглашениями об именах. Кстати, при попытке решить вышеупомянутую проблему ... я создал статический список объектов типа данных "элемент". когда я сделал "listbox3.itemsource = item_list", это не сработало ... я попытался "foreach (item v в list_item) {ilistbox3.items.add (obj);}" это также не сработало
  • 0
    @ user2806673 Вам придется поделиться своим кодом, чтобы я знал больше, чтобы помочь вам в этом, так как для этого есть много возможных причин. Мое лучшее предположение, что вы устанавливаете его до того, как список будет заполнен, или устанавливаете неправильный экземпляр объекта. Возможно, отредактируйте свой ответ, чтобы включить фактический код, который вы используете?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню