C# 如何在C中的视图中绑定viewmodel中对象的IEnumerable列表#

C# 如何在C中的视图中绑定viewmodel中对象的IEnumerable列表#,c#,wpf,mvvm,listbox,ienumerable,C#,Wpf,Mvvm,Listbox,Ienumerable,如何在视图(列表框)中绑定对象的IEnumerable列表 例如,我有: 拥有IEnumerable功能的产品对象 处理向产品添加功能的ViewModel ProductViewModel 允许插入和删除功能的产品视图,以及与Products.features绑定的列表框 问题是每次我添加一个特性时,列表框都不会更新 模型产品 public class Product : ObservableObject { #region Fields string code, n

如何在视图(列表框)中绑定对象的IEnumerable列表

例如,我有:

  • 拥有IEnumerable功能的产品对象
  • 处理向产品添加功能的ViewModel ProductViewModel
  • 允许插入和删除功能的产品视图,以及与Products.features绑定的列表框
问题是每次我添加一个特性时,列表框都不会更新

模型产品

    public class Product : ObservableObject
{
    #region Fields
    string code, name;
    Category category;
    ObservableCollection<Feature> features;
    #endregion

    #region Properties

    public string Code
    {
        get => code;
        set
        {
            if (string.IsNullOrWhiteSpace(value))
                throw new ArgumentNullException(value, "Il codice del prodotto non può essere nullo.");
            if (value.Length > 10)
                throw new ArgumentOutOfRangeException(value, "Il codice del prodotto non può essere lungo più di 10 caratteri.");
            code = value;
            RaisePropertyChangedEvent("Code");
        }
    }

    public string Name
    {
        get => name;
        set
        {
            if (string.IsNullOrWhiteSpace(value))
                throw new ArgumentNullException(value, "Il nome del prodotto non può essere nullo.");
            if (value.Length > 20)
                throw new ArgumentOutOfRangeException(value, "Il nome del prodotto non può essere lungo più di 20 caratteri.");
            name = value;
            RaisePropertyChangedEvent("Name");
        }
    }

    public Category Category
    {
        get => category;
        set
        {
            category = value;
            RaisePropertyChangedEvent("Category");
        }
    }

    public ObservableCollection<Feature> Features
    {
        get => features;
        set
        {
            features = value;
            RaisePropertyChangedEvent("Features");
            RaisePropertyChangedEvent("PrintFeatures");
        }
    }

    public string PrintFeatures
    {
        get
        {
            string line = ""; 
            foreach(var feature in features)
            {
                line += $"{feature.Description}{Environment.NewLine}";
            }
            return line;
        }
    }

    public int HashCode => Code.GetHashCode();

    #endregion
}
公共类产品:ObservieObject
{
#区域字段
字符串代码、名称;
类别;
可观测的采集特征;
#端区
#区域属性
公共字符串代码
{
get=>代码;
设置
{
if(string.IsNullOrWhiteSpace(value))
抛出新的ArgumentNullException(值,“Il codice del prodotto non puòessere nullo.”);
如果(value.Length>10)
抛出新的ArgumentOutOfRangeException(值“Il codice del prodotto non puòessere lungo piùdi 10 caratteri.”);
代码=值;
RaisePropertyChangedEvent(“代码”);
}
}
公共字符串名
{
get=>name;
设置
{
if(string.IsNullOrWhiteSpace(value))
抛出新的ArgumentNullException(值,“Il nome del prodotto non puòessere nullo.”);
如果(value.Length>20)
抛出新的ArgumentOutOfRangeException(值“Il nome del prodotto non puòessere lungo piùdi 20克拉”);
名称=值;
RaisePropertyChangedEvent(“名称”);
}
}
公共类别
{
get=>category;
设置
{
类别=价值;
提高产权变更(“类别”);
}
}
公共可观测集合特征
{
获取=>功能;
设置
{
特征=价值;
提出财产变更(“特征”);
提高属性更改(“打印特征”);
}
}
公共字符串打印特性
{
得到
{
字符串行=”;
foreach(特征中的var特征)
{
line+=$“{feature.Description}{Environment.NewLine}”;
}
回流线;
}
}
public int HashCode=>Code.GetHashCode();
#端区
}
视图模型

public class ProductViewModel : BaseViewModel
{
    #region Fields
    ObservableCollection<Category> categories;
    ObservableCollection<FeatureType> featureTypes;
    #endregion

    #region Data Properties
    public ObservableCollection<Category> Categories
    {
        get => categories;
        set
        {
            categories = value;
            RaisePropertyChangedEvent("Categories");
        }
    }

    public ObservableCollection<FeatureType> FeatureTypes
    {
        get => featureTypes;
        set
        {
            featureTypes = value;
            RaisePropertyChangedEvent("FeatureTypes");
        }
    }

    public Product NewProduct { get; set; }

    public Feature NewFeature { get; set; }

    public Feature SelectedFeature { get; set; }
    #endregion

    #region Commands
    public ICommand AddItem { get; set; }
    public ICommand AddFeature { get; set; }
    #endregion

    #region Constructor
    public ProductViewModel(WarehouseViewModel warehouseViewModel)
    {
        NewFeature = new Feature();
        NewProduct = new Product();

        AddFeature = new AddFeatureCommand(NewProduct.Features, NewFeature);
        AddItem = new AddItemCommand(warehouseViewModel.Products, NewProduct);

        Categories = new ObservableCollection<Category>();
        Categories.Add(new Category { Name = "Infiorescenze" });
        Categories.Add(new Category { Name = "Oli" });

        FeatureTypes = new ObservableCollection<FeatureType>();
        FeatureTypes.Add(new FeatureType
        {
            Name = "Peso",
            UnitMeasure = "grammi",
        });
        FeatureTypes.Add(new FeatureType
        {
            Name = "Pezzi",
            UnitMeasure = "semi",
        });
    }
    #endregion
}
公共类ProductViewModel:BaseViewModel
{
#区域字段
可观察收集类别;
可观测采集特征类型;
#端区
#区域数据属性
公共可观测集合类别
{
get=>类别;
设置
{
类别=价值;
提高产权变更(“类别”);
}
}
公共可观测集合功能类型
{
get=>featureTypes;
设置
{
特征类型=值;
RaisePropertyChangedEvent(“功能类型”);
}
}
公共产品新产品{get;set;}
公共特征NewFeature{get;set;}
公共功能已选择功能{get;set;}
#端区
#区域命令
公共ICommand附加项{get;set;}
公共ICommand AddFeature{get;set;}
#端区
#区域构造函数
公共产品视图模型(仓库视图模型仓库视图模型)
{
NewFeature=NewFeature();
新产品=新产品();
AddFeature=新的AddFeatureCommand(NewProduct.Features,NewFeature);
AddItem=新的AddItemCommand(warehouseViewModel.Products,NewProduct);
类别=新的ObservableCollection();
添加(新类别{Name=“InforeSceneze”});
添加(新类别{Name=“Oli”});
FeatureTypes=新的ObservableCollection();
FeatureType.添加(新FeatureType
{
Name=“比索”,
UnitMeasure=“grammi”,
});
FeatureType.添加(新FeatureType
{
Name=“Pezzi”,
UnitMeasure=“semi”,
});
}
#端区
}
添加要素命令

class AddFeatureCommand : ICommand
{
    #region Fields
    ObservableCollection<Feature> features;
    Feature feature;
    #endregion

    #region Constructor

    public AddFeatureCommand(ObservableCollection<Feature> features, Feature feature)
    {
        this.features = features;
        this.feature = feature;
    }

    #endregion

    #region ICommand Members

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void Execute(object parameter)
    {
        if (features == null)
            features = new ObservableCollection<Feature>();
        var newFeature = new Feature
        {
            Type = new FeatureType
            {
                Name = feature.Type.Name,
                UnitMeasure = feature.Type.UnitMeasure,
            },
            Value = feature.Value,
        };
        features.Add(newFeature);
    }

    #endregion
}
class AddFeatureCommand:ICommand
{
#区域字段
可观测的采集特征;
特征;
#端区
#区域构造函数
public addfeature命令(可观察的采集要素、要素要素)
{
这个。特征=特征;
这个特征=特征;
}
#端区
#区域ICommand成员
公共布尔CanExecute(对象参数)
{
返回true;
}
公共事件事件处理程序CanExecuteChanged
{
添加{CommandManager.RequerySuggested+=value;}
删除{CommandManager.RequerySuggested-=value;}
}
public void Execute(对象参数)
{
如果(功能==null)
features=新的ObservableCollection();
var newFeature=新特性
{
类型=新功能类型
{
Name=feature.Type.Name,
UnitMeasure=feature.Type.UnitMeasure,
},
值=特征。值,
};
添加(newFeature);
}
#端区
}

将您的
IEnumerable
替换为
observedcollection


每当从集合中添加或删除项时,这将通知任何绑定控件。

去看看可观察的集合您的命令代码在哪里?您使用的是同一个VM实例吗?我已插入命令“AddFeature”代码。请添加您的视图代码。如果你忽略它,我们就看不到你绑定了什么。好的,修复了!通过observablecollection,它可以工作。我忘了删除一个不存在的要素类的实例化,该实例化“重写”了我必须在列表中管理的内容。谢谢它不会更新。。。现在在模型“产品”中,我有了道具