C# 列出对象的拥有和不拥有内容

C# 列出对象的拥有和不拥有内容,c#,wpf,mvvm,C#,Wpf,Mvvm,我有: 我有 public class Extra { public string Name {get;set;} } 公共类CarViewModel { 公共ObservableCollection OwningExtras{get;set;} 公共静态IEnumerable AllExtras { 得到 { 返回额外的.GetAllExtras(); } } 公共汽车视图模型() { owningExtras=Extra.GetAvailableExtrasForCar(idCar) }

我有:

我有

public class Extra
{
public string Name {get;set;}
}
公共类CarViewModel
{
公共ObservableCollection OwningExtras{get;set;}
公共静态IEnumerable AllExtras
{
得到
{
返回额外的.GetAllExtras();
}
}
公共汽车视图模型()
{
owningExtras=Extra.GetAvailableExtrasForCar(idCar)
}
}
CarView看起来像:

public class CarViewModel
{
 public ObservableCollection<Extra> OwningExtras { get; set; }
public static IEnumerable<Extra> AllExtras
        {
            get
            {
                return Extra.GetAllExtras();
            }
        }
public CarViewModel()
{
owningExtras=Extra.GetAvailableExtrasForCar(idCar)
}
}



下面的代码将在列表框中显示集合AllExtras中的所有项,并用选中的项填充集合CheckedExtras。这只是解决这一问题的众多方法之一。不确定“如何注意到某些东西发生了变化”是什么意思。是否需要通知您已更新包含选中项的集合?在这种情况下,您可以改为使用ObservableCollection并侦听其CollectionChanged事件

XAML:


代码隐藏:

<Window x:Class="ListBoxTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <StackPanel>

        <ListBox ItemsSource="{Binding Path=AllExtras}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <CheckBox Click="OnCheckBoxClick" /> 
                        <TextBlock Text="{Binding Path=Name}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

    </StackPanel>

</Window>
使用System.Collections.Generic;
使用System.Windows;
使用System.Windows.Controls;
名称空间ListBoxTest
{
公共部分类Window1:Window
{
公共窗口1()
{
初始化组件();
DataContext=newvm();
}
私有void OnCheckBoxClick(对象发送方,路由目标)
{
VM VM=DataContext作为VM;
复选框=发送者为复选框;
Extra-Extra=checkBox.DataContext作为Extra;
if(checkBox.IsChecked.GetValueOrDefault())
{
vm.CheckedExtras.Add(额外);
}
其他的
{
vm.CheckedExtras.Remove(额外);
}
}
}
公共类虚拟机
{
公共虚拟机()
{
CheckedExtras=新列表();
AllExtras=new List(){new Extra(){Name=“A”},new Extra(){Name=“B”},new Extra(){Name=“C”},};
}
公共列表CheckedExtras{get;private set;}
公共列表AllExtras{get;private set;}
}
公务舱额外收费
{
公共字符串名称{get;set;}
} 
}

有一个很好的例子,byt有一个静态的项目列表,它已经关闭,但是当我更改为CheckedExtras=new list(){new Extra(){Name=“a”}时;并运行我的应用程序所有复选框仍处于未选中状态。包含选中项的集合永远不会更新。AllExtras列表是常量。如果选中,是否可以向额外类添加bool属性?然后复选框可以数据绑定到bool属性。CheckedExtras将只是一个linq查询,它过滤掉bool属性设置为true的额外对象。CheckedExtras已更新,请参阅OnCheckBoxClick方法。allExtras是常量是什么意思?allExtras是常量意味着我从xml加载allExtras,用户不能更改此列表。他只能更改与car相关的附加列表(通过复选框)。布尔菲尔德的想法很有趣。我去查一下。干得好!:)我建议为列表中的每个项目将“额外”类包装在viewmodel中。这样,您就可以将IsChecked绑定到viewmodel上的bool属性,甚至是命令。基础模型不必改变
<Window x:Class="ListBoxTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <StackPanel>

        <ListBox ItemsSource="{Binding Path=AllExtras}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <CheckBox Click="OnCheckBoxClick" /> 
                        <TextBlock Text="{Binding Path=Name}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

    </StackPanel>

</Window>
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;

namespace ListBoxTest
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            DataContext = new VM();
        }

        private void OnCheckBoxClick(object sender, RoutedEventArgs e)
        {
            VM vm = DataContext as VM;
            CheckBox checkBox = sender as CheckBox;
            Extra extra = checkBox.DataContext as Extra;
            if (checkBox.IsChecked.GetValueOrDefault())
            {
                vm.CheckedExtras.Add(extra);
            }
            else
            {
                vm.CheckedExtras.Remove(extra);
            }
        }
    }

    public class VM
    {
        public VM()
        {
            CheckedExtras = new List<Extra>();
            AllExtras = new List<Extra>() { new Extra() { Name = "A" }, new Extra() { Name = "B" }, new Extra() { Name = "C" }, };
        }

        public List<Extra> CheckedExtras { get; private set; }
        public List<Extra> AllExtras { get; private set; }
    }

    public class Extra
    {
        public string Name { get; set; }
    } 
}