C# WPF:如何观察观察到的对象的列表属性

C# WPF:如何观察观察到的对象的列表属性,c#,wpf,C#,Wpf,在我的viewmodel对象中,我有一个名为Item的类和一个ObservableCollection。我已将其绑定到列表框。但是Item有一个名为Stats的字段,它是一个列表,我想将它绑定到另一个列表框。我不能将其设置为可观察集合,因为项和统计都是单独类库的一部分,将在非wpf项目中使用。我正在开发它们,这样我就可以做任何我想做的改变,但我不知道该怎么做 我正在尝试开发一个编辑器,这样人们可以从第一个列表中选择一个项目,并向所选项目添加统计信息(并进一步自定义这些统计信息) 任何帮助都将不胜

在我的viewmodel对象中,我有一个名为
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