如何将自定义对象列表作为源绑定到列表框?

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 命名约定并使用它。 :)