0

我有一个 XamDataPresenter (XamDataGrid) 绑定到 ViewModel 中的集合:

XAML:

<igDP:XamDataPresenter x:Name="dataPresenter" DataSource="{Binding Path=AppServers, UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="True">
</igDP:XamDataPresenter>

代码:

public ShellViewModel()
    {
        AppServers = new BindingListCollectionView(new BindingList<AppServer>(_context.GetAllAppServers()));

        AppServers.CurrentChanged += new EventHandler(AppServers_CurrentChanged);
    }

    void AppServers_CurrentChanged(object sender, EventArgs e)
    {
        NotifyOfPropertyChange(() => CanSaveAppServers);
        NotifyOfPropertyChange(() => CanDeleteAppServers);
    }

CanSaveAppServers 属性:

public bool CanSaveAppServers
    {
        get
        {
            return (_appServers.SourceCollection as BindingList<AppServer>).Any(x => x.ChangeTracker.State != ObjectState.Unchanged);
        }
    }

如果更改了集合的项目,则 CanSaveAppServers 属性应为 false。但是如何调用 CanSaveAppServers 呢?另一个事件?还是错误的集合类型?这不应该以某种方式自动完成吗?

提前致谢。

4

1 回答 1

0

如果您让 Caliburn 通过命名约定进行绑定,那么您有一个名为SaveAppServers. Caliburn 创建一个ICommand绑定到 的 ,Button以便在单击按钮时调用ICommand's 。Execute()同时,有一种CanExecute()方法ICommand用于确定按钮是否启用。

当您调用时NotifyOfPropertyChange(() => CanSaveAppServers),这最终会ICommand引发 raise 它的CanExecuteChanged事件,这会通过CanExecute()再次调用来刷新 WPF,这在幕后正在获取CanSaveAppServers.

于 2011-05-08T06:23:24.660 回答