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; }
}
}