Я привязываю, чтобы привязать список пользовательских объектов как источник к списку, в котором у моего списка есть пользовательский шаблон как
<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.
Проблема заключается в том, что изменения (которые отражены в экземпляре класса элементов) не отражаются автоматически в другом представлении/привязке к элементу списка. Если вы хотите уведомить второе представление о том, что свойство экземпляра 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);
}
}
}
}
Вы привязываете свой 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 и его использование. :)
listBox3.ItemsSource
для вашей статической коллекции. Вместо этого я вижу, что вы просматриваете свою коллекцию и добавляете каждый элемент вlistBox3.Items
отдельности. Эти два действия не совпадают. Мне нравится писать в блоге темы для начинающих по WPF, и я настоятельно рекомендую вам прочитать ссылки в этом ответе, чтобы узнать, как работает система связывания WPF, что такое DataContext и как разрабатывать приложение WPF с использованием дизайна MVVM. шаблон. Удачи :)<ListBoxItem>
для каждого объекта, а затем установитеListBoxItem.DataContext
для самого объекта». Если привязка кObservableCollection
, то каждый раз, когда элемент добавляется или удаляется из коллекции, ListBox будет повторно оценивать элементы, чтобы увидеть, какие элементы были добавлены или удалены, и соответствующим образом обновит интерфейс.