Как связать IEnumerable список объекта в viewmodel в представлении в C # - PullRequest
0 голосов
/ 10 октября 2018

Как я могу связать список IEnumerable объекта в представлении (listbox)?

Например, у меня есть:

  • Объект Product, который владеет функциями IEnumerable.
  • ViewModel ProductViewModel, которая занимается добавлением функций к продукту.
  • Представление продукта, которое позволяет выполнять действия по вставке и удалению функций, а также связанный список со списком Products.Features.

Проблема в том, что при каждом добавлении компонента список не обновляется.

Модель PRODUCT

    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
}

ViewModel

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
}

ДОБАВИТЬ ФУНКЦИЮ

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
}

1 Ответ

0 голосов
/ 10 октября 2018

Замените вас IEnumerable<T> на ObservableCollection<T>.

Это будет уведомлять любой связанный элемент управления, когда элемент добавляется или удаляется из коллекции.

...