如何将自定义对象列表作为源绑定到列表框?
How to bind a list of custom object as source to listbox?
我想将自定义对象列表作为源绑定到列表框,其中我的列表框具有用户模板
<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;
}
我无法将此列表绑定到列表框。我想以这种方式绑定列表,无论何时对列表中的复选框进行更改,它们都应该反映在对象列表(项目)中。
listbox3.itemsource = list_items
这对我不起作用
在这里,我无法将 listbox3 绑定到 class checkvm 的对象列表。
您的问题是更改(反映在项目 class 的实例中)不会自动反映到另一个视图/绑定到列表的项目。如果你想通知第二个视图 item
实例的 属性 已经改变,它必须实现 INotifyPropertyChanged
。
最简单的方法是使用 MVVM 框架。您的项目 class 应该扩展实现更改通知的 ViewModel class。
示例:
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
class 不包含名为 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>
另请注意,如果您希望能够在后面的代码中更改您的项目并让它自动更新 UI,或者如果您想要,您的 class 应该实施 INotifyPropertyChanged
进行任何类型的更改通知。
附带说明一下,我讨厌你的(缺乏)命名约定。我强烈建议使用谷歌搜索标准的 .Net 命名约定并使用它。 :)
我想将自定义对象列表作为源绑定到列表框,其中我的列表框具有用户模板
<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;
}
我无法将此列表绑定到列表框。我想以这种方式绑定列表,无论何时对列表中的复选框进行更改,它们都应该反映在对象列表(项目)中。
listbox3.itemsource = list_items
这对我不起作用
在这里,我无法将 listbox3 绑定到 class checkvm 的对象列表。
您的问题是更改(反映在项目 class 的实例中)不会自动反映到另一个视图/绑定到列表的项目。如果你想通知第二个视图 item
实例的 属性 已经改变,它必须实现 INotifyPropertyChanged
。
最简单的方法是使用 MVVM 框架。您的项目 class 应该扩展实现更改通知的 ViewModel class。
示例:
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
class 不包含名为 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>
另请注意,如果您希望能够在后面的代码中更改您的项目并让它自动更新 UI,或者如果您想要,您的 class 应该实施 INotifyPropertyChanged
进行任何类型的更改通知。
附带说明一下,我讨厌你的(缺乏)命名约定。我强烈建议使用谷歌搜索标准的 .Net 命名约定并使用它。 :)