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

时间:2015-03-25 15:18:52

标签: c# .net wpf listbox checklistbox

我想绑定一个自定义对象列表作为列表框的源,我的列表框中有用户模板

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

我使用此模板作为listbox的数据类型

      <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绑定到类checkvm的对象列表。

2 个答案:

答案 0 :(得分:1)

您的问题是更改(反映在项类的实例中)不会自动反映到另一个视图/绑定到列表项。如果要通知第二个视图item实例的属性已更改,则必须实现INotifyPropertyChanged。 最简单的方法是使用MVVM框架。您的item类应该扩展实现更改通知的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 :(得分:1)

您将CheckBox.Checked绑定到“缺席”,但是您的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>

另请注意,如果您希望能够更改代码中的项目并让其自动更新UI,或者您希望进行任何类型的更改通知,那么您的类应该实现INotifyPropertyChanged

作为旁注,我讨厌你的(缺乏)命名约定。我强烈建议谷歌搜索标准的.Net命名约定并使用它。 :)