В C # как вызвать событие PropertyChanged, когда изменяются элементы в массиве

Как уже упоминалось ранее, API-интерфейсы FileSystem и File , а также API FileWriter могут использоваться для чтения и записи файлов из контекст вкладки / окна браузера на клиентскую машину.

Существует несколько вещей, относящихся к API-интерфейсам FileSystem и FileWriter, о которых вы должны знать, некоторые из которых были упомянуты, но заслуживают повторения:

  • Реализации API в настоящее время существуют только в браузерах на основе хрома (Chrome & amp; Opera)
  • Оба API были сняты со стандартного трека W3C 24 апреля 2014 года , и на данный момент являются собственностью
  • . Удаление (теперь запатентованных) API-интерфейсов от реализации браузеров в будущем - это возможность
  • Песочница (местоположение на диске, за пределами которого файлы могут не производят никакого эффекта) используется для хранения файлов, созданных с помощью API.
  • Виртуальная файловая система (структура каталогов, которая необязательно существует на диске в той же форме, что и при доступе от в браузере) используются файлы, созданные с помощью API-интерфейсов

. Вот простые примеры того, как API-интерфейсы используются, прямо или косвенно, в тандеме для выполнения следующих действий:

BakedGoods *

Запись файла:

bakedGoods.set({
    data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
    storageTypes: ["fileSystem"],
    options: {fileSystem:{storageType: Window.PERSISTENT}},
    complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});

Чтение файла:

bakedGoods.get({
        data: ["testFile"],
        storageTypes: ["fileSystem"],
        options: {fileSystem:{storageType: Window.PERSISTENT}},
        complete: function(resultDataObj, byStorageTypeErrorObj){}
});

Использование необработанного файла, FileWriter и API FileSystem

Запись файла:

function onQuotaRequestSuccess(grantedQuota)
{

    function saveFile(directoryEntry)
    {

        function createFileWriter(fileEntry)
        {

            function write(fileWriter)
            {
                var dataBlob = new Blob(["Hello world!"], {type: "text/plain"});
                fileWriter.write(dataBlob);              
            }

            fileEntry.createWriter(write);
        }

        directoryEntry.getFile(
            "testFile", 
            {create: true, exclusive: true},
            createFileWriter
        );
    }

    requestFileSystem(Window.PERSISTENT, grantedQuota, saveFile);
}

var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);

Файл чтения:

function onQuotaRequestSuccess(grantedQuota)
{

    function getfile(directoryEntry)
    {

        function readFile(fileEntry)
        {

            function read(file)
            {
                var fileReader = new FileReader();

                fileReader.onload = function(){var fileData = fileReader.result};
                fileReader.readAsText(file);             
            }

            fileEntry.file(read);
        }

        directoryEntry.getFile(
            "testFile", 
            {create: false},
            readFile
        );
    }

    requestFileSystem(Window.PERSISTENT, grantedQuota, getFile);
}

var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);

Хотя API-интерфейсы FileSystem и FileWriter больше не соответствуют стандартам трек, их использование может быть оправдано в некоторых случаях, на мой взгляд, потому что:

  • Возобновленный интерес у недействующих поставщиков браузеров может вернуть их обратно на него
  • Рыночное проникновение внедряющих (на основе хромовых) браузеров велико
  • . Google (главный вклад в Chromium) не дал и не закончил API API

Однако, если «некоторые случаи» охватывают ваши собственные, вы должны решить.

* BakedGoods поддерживается не кем иным, как парень прямо здесь:)

0
задан Pravin 18 January 2019 в 09:41
поделиться

3 ответа

Представьте, что вы используете не двойной, а какой-то класс. И затем, что поле этого класса изменилось. Должен ли массив поднять свойство изменено? Конечно нет. Таким образом, есть несколько решений, которые вы можете рассмотреть:

  • использовать ObservableCollection и метод SetItem
  • использовать ObservableCollection и вместо присвоения значения удалить и вставить значение [ 116]
  • вместо двойного использования некоторого класса, который реализует INotifyPropertyChanged, и когда изменения в dobule вызывают это событие, должен быть правильный подход, если целью является привязка данных
  • , воссоздайте Array каждый раз ( громоздкий и неэффективный, но все еще работает)
0
ответ дан Ivan Ičin 18 January 2019 в 09:41
поделиться

Как уже упоминалось, в вашем случае вы запускаете NotifyPropertyChanged (), когда изменяется сам массив, а не какой-либо элемент массива.

Если вы хотите, чтобы элементы могли запускать событие, вам нужно реализовать класс, подобный:

public class NotifyingData<T> : INotifyPropertyChanged 
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    private T _Data;
    public T Data
    {
        get { return _Data; }
        set { _Data = value; NotifyPropertyChanged(); }
    }
}

, а затем заполнить ваш массив этим классом:

_OffsetAngles[0] = new NotifyingData<double> { Data = 10 };
[115 ] У меня нет доступа к VS прямо сейчас, поэтому могут быть некоторые ошибки, но это должно быть правильным понятием для вас.

0
ответ дан cmos 18 January 2019 в 09:41
поделиться

У меня была такая же проблема некоторое время назад. Мне приходилось обновлять DataTable всякий раз, когда данные менялись, и вот как я решил это в своей программе:

public ObservableCollection<KeyStroke> keyList = new ObservableCollection<KeyStroke>();
public class KeyStroke : INotifyPropertyChanged
{
    // KeyStroke class storing data about each key and how many types it received
    private int id;
    private int numPress;
    public KeyStroke(int id, int numPress)
    {
        Id = id;
        NumPress = numPress;
    }
    public int Id
    {
        get => id;
        set
        {
            id = value;
            NotifyPropertyChanged("Id");
        }
    }
    public int NumPress
    {
        get { return this.numPress; }
        set
        {
            this.numPress = value;
            NotifyPropertyChanged("NumPress");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged; //This handle the propertyChanged
    private void NotifyPropertyChanged(String propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); //This is the WPF code for the DataGrid but you can replace it by whatever you need
    }
}

Это должно помочь вам. Вы также можете помещать условия в методы получения / установки свойств, но я думаю, что это не очень красиво

0
ответ дан Keelah 18 January 2019 в 09:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: