C# WPF:如何观察观察到的对象的列表属性
在我的viewmodel对象中,我有一个名为C# WPF:如何观察观察到的对象的列表属性,c#,wpf,C#,Wpf,在我的viewmodel对象中,我有一个名为Item的类和一个ObservableCollection。我已将其绑定到列表框。但是Item有一个名为Stats的字段,它是一个列表,我想将它绑定到另一个列表框。我不能将其设置为可观察集合,因为项和统计都是单独类库的一部分,将在非wpf项目中使用。我正在开发它们,这样我就可以做任何我想做的改变,但我不知道该怎么做 我正在尝试开发一个编辑器,这样人们可以从第一个列表中选择一个项目,并向所选项目添加统计信息(并进一步自定义这些统计信息) 任何帮助都将不胜
Item
的类和一个ObservableCollection
。我已将其绑定到列表框
。但是Item
有一个名为Stats
的字段,它是一个列表
,我想将它绑定到另一个列表框
。我不能将其设置为可观察集合
,因为项
和统计
都是单独类库的一部分,将在非wpf项目中使用。我正在开发它们,这样我就可以做任何我想做的改变,但我不知道该怎么做
我正在尝试开发一个编辑器,这样人们可以从第一个列表中选择一个项目,并向所选项目添加统计信息(并进一步自定义这些统计信息)
任何帮助都将不胜感激。您为什么不实施
INotifyPropertyChanged
public class Stat : INotifyPropertyChanged
{
private int _your_property;
public int your_property {
get { return _your_property; }
set {
_your_property = value;
NotifyPropertyChanged("your_property");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (null != handler) {
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
为什么不实现INotifyPropertyChanged
public class Stat : INotifyPropertyChanged
{
private int _your_property;
public int your_property {
get { return _your_property; }
set {
_your_property = value;
NotifyPropertyChanged("your_property");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (null != handler) {
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
为什么不实现INotifyPropertyChanged
public class Stat : INotifyPropertyChanged
{
private int _your_property;
public int your_property {
get { return _your_property; }
set {
_your_property = value;
NotifyPropertyChanged("your_property");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (null != handler) {
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
为什么不实现INotifyPropertyChanged
public class Stat : INotifyPropertyChanged
{
private int _your_property;
public int your_property {
get { return _your_property; }
set {
_your_property = value;
NotifyPropertyChanged("your_property");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (null != handler) {
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
您可以为可观察的统计信息再创建一个属性。请参阅以下代码
class Item
{
private List<Stat> stat;
public List<Stat> Stats
{
get { return stat; }
set { stat = value; }
}
public ObservableCollection<Stat> ObservableStats
{
get { return new ObservableCollection<Stat>(stat); }
}
}
类项目
{
私人名单统计;
公共列表统计数据
{
获取{return stat;}
设置{stat=value;}
}
公共可观测集合可观测资产
{
获取{returnnewobserveCollection(stat);}
}
}
您可以为可观察的统计数据再创建一个属性。请参阅以下代码
class Item
{
private List<Stat> stat;
public List<Stat> Stats
{
get { return stat; }
set { stat = value; }
}
public ObservableCollection<Stat> ObservableStats
{
get { return new ObservableCollection<Stat>(stat); }
}
}
类项目
{
私人名单统计;
公共列表统计数据
{
获取{return stat;}
设置{stat=value;}
}
公共可观测集合可观测资产
{
获取{returnnewobserveCollection(stat);}
}
}
您可以为可观察的统计数据再创建一个属性。请参阅以下代码
class Item
{
private List<Stat> stat;
public List<Stat> Stats
{
get { return stat; }
set { stat = value; }
}
public ObservableCollection<Stat> ObservableStats
{
get { return new ObservableCollection<Stat>(stat); }
}
}
类项目
{
私人名单统计;
公共列表统计数据
{
获取{return stat;}
设置{stat=value;}
}
公共可观测集合可观测资产
{
获取{returnnewobserveCollection(stat);}
}
}
您可以为可观察的统计数据再创建一个属性。请参阅以下代码
class Item
{
private List<Stat> stat;
public List<Stat> Stats
{
get { return stat; }
set { stat = value; }
}
public ObservableCollection<Stat> ObservableStats
{
get { return new ObservableCollection<Stat>(stat); }
}
}
类项目
{
私人名单统计;
公共列表统计数据
{
获取{return stat;}
设置{stat=value;}
}
公共可观测集合可观测资产
{
获取{returnnewobserveCollection(stat);}
}
}
如果您不能修改项目以保存除列表以外的内容,则无法执行您想要的操作。您需要创建一个ItemViewModel
,其中包含一个可观察集合
。然后放入ToModel()函数,这样在完成后将它们转换回模型形式。必须通过视图模型代理执行所有读写操作才能引发事件
public class ViewModel
{
public ObservableCollection<ItemViewModel> Items { get; set; }
public IEnumerable<StatModifierType> StatModifierTypes
{
get { return Enum.GetValues(typeof(StatModifierType)).Cast<StatModifierType>(); }
}
public ViewModel()
{
Items = new ObservableCollection<ItemViewModel>();
}
}
public class ItemViewModel : INotifyPropertyChanged
{
public ItemViewModel(Item item)
{
if(item == null)
throw new ArgumentNullException("item");
Name = item.Name;
Id = item.Id;
Description = item.Description;
//This converts our List<StatModifier> to a IEnumerable<StatModifierViewModel>
var enumerableOfStatViewModels = item.Stats.Select(x => new StatModifierViewModel(x));
_stats = new ObservableCollection<StatModifierViewModel>(enumerableOfStatViewModels);
}
public Item ToModel()
{
var item = new Item();
item.Name = Name;
item.Id = Id;
item.Description = Description;
//This converts our ObservableCollection<StatModifierViewModel> to a IEnumerable<StatModifier>
var enumerableOfStats = Stats.Select(x => x.StatModifierModel);
item.Stats = enumerableOfStats.ToList();
}
private ObservableCollection<StatModifierViewModel> _stats;
private string _name;
private string _id;
private string _description;
public ObservableCollection<StatModifierViewModel> Stats
{
get { return _stats; }
set
{
if (Equals(value, _stats))
return;
_stats = value;
OnPropertyChanged();
}
}
public string Name
{
get { return _name; }
set
{
if (value == _name)
return;
_name = value;
OnPropertyChanged();
}
}
public string Id
{
get { return _id; }
set
{
if (value == _id)
return;
_id = value;
OnPropertyChanged();
}
}
public string Description
{
get { return _description; }
set
{
if (value == _description)
return;
_description = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public class StatModifierViewModel : INotifyPropertyChanged
{
private readonly StatModifier _statModifier;
public StatModifierViewModel(StatModifier statModifier)
{
//This needs to not be null to not blow up the other functions.
if(statModifier == null)
throw new ArgumentNullException("statModifier");
_statModifier = statModifier;
}
public string StatId
{
get { return _statModifier.StatId; }
set
{
if (Equals(_statModifier.StatId, value))
return;
_statModifier.StatId = value;
OnPropertyChanged();
}
}
public StatModifierType Type
{
get { return _statModifier.Type; }
set
{
if (Equals(_statModifier.Type, value))
return;
_statModifier.Type = value;
OnPropertyChanged();
}
}
public float Value
{
get { return _statModifier.Value; }
set
{
if (Equals(_statModifier.Value, value))
return;
_statModifier.Value = value;
OnPropertyChanged();
}
}
public StatModifier StatModifierModel
{
get { return _statModifier; }
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
公共类视图模型
{
公共ObservableCollection项{get;set;}
公共IEnumerable StatModifier类型
{
get{return Enum.GetValues(typeof(StatModifierType)).Cast();}
}
公共视图模型()
{
Items=新的ObservableCollection();
}
}
公共类ItemViewModel:INotifyPropertyChanged
{
公共项目视图模型(项目)
{
如果(项==null)
抛出新的异常(“项”);
名称=项目名称;
Id=item.Id;
描述=项目。描述;
//这会将列表转换为IEnumerable
var enumerableOfStatViewModels=item.Stats.Select(x=>newstatmodifierviewmodel(x));
_stats=新的ObservableCollection(enumerableOfStatViewModels);
}
公共项目ToModel()
{
var item=新项();
item.Name=名称;
项目Id=Id;
项目描述=描述;
//这将我们的ObservableCollection转换为IEnumerable
var enumerableOfStats=Stats.Select(x=>x.StatModifierModel);
item.Stats=enumerableOfStats.ToList();
}
私人可观察收集统计数据;
私有字符串\u名称;
私有字符串_id;
私有字符串描述;
公共可观测收集统计数据
{
获取{return\u stats;}
设置
{
如果(等于(值,_stats))
返回;
_统计=价值;
OnPropertyChanged();
}
}
公共字符串名
{
获取{return\u name;}
设置
{
如果(值==\u名称)
返回;
_名称=值;
OnPropertyChanged();
}
}
公共字符串Id
{
获取{return\u id;}
设置
{
如果(值==\u id)
返回;
_id=值;
OnPropertyChanged();
}
}
公共字符串描述
{
获取{return\u description;}
设置
{
如果(值==\u说明)
返回;
_描述=值;
OnPropertyChanged();
}
}
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void OnPropertyChanged([CallerMemberName]字符串propertyName=null)
{
var handler=PropertyChanged;
if(处理程序!=null)
处理程序(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共类StatModifierViewModel:INotifyPropertyChanged
{
专用只读StatModifier\u StatModifier;
公共StatModifier视图模型(StatModifier StatModifier)
{
//这需要不为null,以避免炸毁其他函数。
if(statModifier==null)
抛出新ArgumentNullException(“statModifier”);
_statModifier=statModifier;
}
公共字符串StatId
{
获取{return\u statModifier.StatId;}
设置
{
if(等于(_statModifier.StatId,value))
返回;
_statModifier.Stat