Инициирующее событие событие


У меня есть небольшое приложение, которое я dumbed вниз, чтобы показать вам основы того, что Excel для читателя будет выглядеть для новых продуктов, состоящий из фруктов и мяса.

Заявление пишется в WPF, C# и повторяет архитектуру MVVM. Так на моем главном окне у меня есть Create кнопка, что я хочу, чтобы отключить, если что-то из списка не подходит. Эти списки находился внутри пользовательского элемента управления, на котором размещены списки в 2 таблицы.

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

Это работает и позволяет мне очень легко расширить эту проверку без использования дублирующихся данных.

Однако я не уверен, что события, вызывающие другие события в дереве, особенно такой большой, является 'хорошей практики'. Так вот почему я думал, просить помощь от богов код.

Вы можете ознакомиться с dumbed вниз версия того, что я сейчас делаю ниже.

Главное Окно

public void Init(ImportType type)
{
    var view = new FoodView();
    SelectedView = view;        
    SelectedView.CollectionItemChanged += (s, e) => RaisePropertyChanged(nameof(CheckErrors));
}

Контроль пользователя пищевыми продуктами

public class FoodViewModel : ObservableObject, IImporter
{
    public event PropertyChangedEventHandler CollectionItemChanged;
    private FoodFileProcessor rfp;

    public void SetFileAsync(string fullFilePath)
    {
        rfp.FoodCollectionItemChanged += (s, e) => OnCollectionItemChanged(s, e);

        // Open and process the file passed
        Task.Run(() => rfp.OpenFile(fullFilePath));
    }
}

Обработка файла

public class MeatFileProcessor
{
    public event PropertyChangedEventHandler MeatsCollectionItemChanged;

    public ObservableCollection<Fruit> NewFruits = new ObservableCollection<Fruit>();
    public ObservableCollection<Meat> NewMeats = new ObservableCollection<Meat>();

    public void OpenFile(string filePath)
    {
        using (var xlApp = new ExcelPackage(new FileInfo(filePath)))
        {
            FruitTabProcessor.ListItemProperyChanged += (s, e) => { OnFruitsCollectionChanged(s, e); };
            ObservableCollection<Fruit> fruits = FruitTabProcessor.FormatFruit(xlApp.Workbook.Worksheets[2]);
            NewFruits = fruits;

            MeatTabProcessor.ListItemProperyChanged += (s, e) => { OnMeatsCollectionChanged(s, e); };
            var meats = MeatTabProcessor.FormatMeat(xlApp.Workbook.Worksheets[1]);
            NewMeats = meats;
            }
        }
    }
}

Это то пример, где объект питания создаются, например мяса.

private static void NewMeat(Meat meat)
{
    meat.PropertyChanged += Meat_PropertyChanged;
}

private static void Meat_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    OnListItemPropertyChanged(sender, e);
}

protected static void OnListItemPropertyChanged(object s, PropertyChangedEventArgs e)
{
    ListItemProperyChanged?.Invoke(s, e);
}

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



174
1
задан 4 апреля 2018 в 11:04 Источник Поделиться
Комментарии
1 ответ

Пару замечаний.

Посмотрите на метод ICommand, я использую этот пакет NuGet https://www.nuget.org/packages/RelayCommand

Это позволяет:

public ICommand SomeCommand => new RelayCommand<SomeType>(DoSomething, x => CanDoSomething());

public void DoSomething(SomeType parameter)
{
//ToDo: Implement me
}

public bool CanDoSomething()
{
//ToDo: Implement me
}

Когда вы не можете сделать что-то (предметы не выбраны, например), то ваша кнопка будет автоматически отключить.

Пара заметок о коллекции ObservableCollection. Это будет уведомлять вас при добавлении товара.

Объект, который можно добавлять и удалять нужно реализовать INotifyProperty изменен, так что вы можете следить за изменениями в вашем представлении на ваши объекты.

Вы используете много подписок обработчика событий - но вы не отписка - это может привести к утечкам памяти. Использовать метод ICommand, где это возможно, чтобы избежать утечек.

Я не уверен, если это правильно, но не ваша собственность FruitTabProcessor изменен обработчик подписки на OnMeats не подписаться на OnFruits?

0
ответ дан 5 апреля 2018 в 09:04 Источник Поделиться