-1

私はこのようなクラスを持っています:

public class ResourceList : ObservableCollection<Resource>
{
    public ResourceList() : base()
    {
    }
}

public class Resource
{
    public Resource()
    {
        Name = "";
        EMail = "";
        Date = "";
        Time = "";
        SWList = new ObservableCollection<string>();
    }
    public string Name { get; set; }
    public string EMail { get; set; }
    public string Date { get; set; }
    public string Time { get; set; }
    public ObservableCollection<string> SWList { get; set; }
}

public class Licenses : ObservableCollection<Licenses>
{
    public Licenses()
    {
    }
    public string Name { get; set; }
    public string License { get; set; }
}

次の 2 つのコマンドは、ほとんど同じように見えます。

internal class ReadResourceFilesCommand : ICommand
{
    public ReadResourceFilesCommand(ResourceViewModel viewModel)
    {
        _viewModel = viewModel;
    }

    private ResourceViewModel _viewModel;

    #region ICommand Members

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

    bool ICommand.CanExecute(object parameter)
    {
        return _viewModel.CanUpdate;
    }

    void ICommand.Execute(object parameter)
    {
        _viewModel.ReadResourceFile(parameter.ToString());
    }
    #endregion
}



internal class ReadInventoryFilesCommand : ICommand
{
    public ReadInventoryFilesCommand(ResourceViewModel viewModel)
    {
        _viewModel = viewModel;
    }

    private ResourceViewModel _viewModel;

    #region ICommand Members

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

    bool ICommand.CanExecute(object parameter)
    {
        return _viewModel.CanUpdate;
    }

    void ICommand.Execute(object parameter)
    {
        _viewModel.ReadInventroyFiles(parameter.ToString());
    }
    #endregion
}

そして私のviewModelは次のようCanUpdateになりResourceListます:

public bool CanUpdate
{
    get
    {
        if (ResourceList == null)
        {
            return false;
        }
        return true;
    }
}

public ResourceList ResourceList
{
    get
    {
        return _ResourceList;
    }
    set
    {
        if (value == _ResourceList)
            return;

        _ResourceList = value;

        // INotifyPropertyChanged Method for updating the binding
        onPropertyChanged("ResourceList");
    }
}

実際の問題: 最初のコマンドが実行されたとき、どちらでもかまいません。GUI のlistView読み込まれ、すべてが正常に見えます。しかし、他のコマンドが実行されると (実際には同じリスト内の要素が更新され、すべての要素のTimeおよびDate属性が更新されます)、listViewはその要素を更新しません。

リスト全体を変更しているのではなく、リスト内のいくつかの要素を更新しているため、更新されていない可能性があります。しかし、私は本当にどうすればよいのかわかりませんか?コードを変更する方法を説明してください!

4

1 に答える 1

2

Resource クラスは INotifyPropertyChanged を実装していません。

このインターフェイスにより、View は Resource のインスタンスへの変更を通知されます。ObservableCollection がビューにコレクションへの変更 (アイテムの追加、削除、移動) を通知するように

public class Resource : INotifyPropertyChanged
{
    public Resource()
    {
        Name = "";
        EMail = "";
        Date = "";
        Time = "";
        SWList = new ObservableCollection<string>();
    }

    // TODO: do this for all properties:

    private string name;
    public string Name
    {
        get { return name;}
        set 
        {
            if(name != value) 
            {
                name = value;
                OnPropertyChanged("Name");
            }
        }
    }



    protected void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if(handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName);
        }
    }
}
于 2013-10-21T06:30:24.143 に答える