【问题标题】:How to update DataGrid如何更新数据网格
【发布时间】:2019-05-16 08:59:44
【问题描述】:

应用的 DataContext 绑定到我的 MainViewModel。这个 ViewModel 有一个属性 services 和一些其他属性。当我启动一项服务时,我想在我的StartService()RefreshServices() 中调用OnPropertyChanged("Services"),但它没有更新。

我的 XAML/DataGrid:

        <DataGrid x:Name="dataGrid" Grid.Row="2" Grid.ColumnSpan="8"
                  ItemsSource="{Binding Services}"
                  AutoGenerateColumns="False"
                  IsReadOnly="True">

            <DataGrid.Columns>
                <DataGridTextColumn Header="Display Name"  Binding="{Binding DisplayName, Mode=OneWay}"/>
                <DataGridTextColumn Header="Status" Binding="{Binding Status, Mode=OneWay}" />
                <DataGridTextColumn Header="Machine Name" Binding="{Binding MachineName, Mode=OneWay }" />
                <DataGridTextColumn Header="Can Stop" Binding="{Binding CanStop, Mode=OneWay}" />
            </DataGrid.Columns>
        </DataGrid>

我的 ViewModel:

namespace ServiceStarterPRAT.ViewModels
{
    public class MainViewModel : ObservableObject
    {
        #region Services Properties
        private ObservableCollection<ServiceController> _services;
        private ObservableCollection<ServiceController> _selectedServices;

        public ObservableCollection<ServiceController> SelectedServices
        {
            get
            {
                return _selectedServices;
            }
            set
            {
                if (_selectedServices == null) return;
                _selectedServices = value;
                OnPropertyChanged("SelectedServices");
            }
        }
        public ObservableCollection<ServiceController> Services
        {
            get
            {
                _services.Clear();
                var curenntServices = Utils.UpdateServices(ComputerNames);
                foreach (var service in curenntServices)
                    if (service.MachineName == SelectedComputer)
                        if (Utils.CustomerNameOf(service) == SelectedCustomer)
                            _services.Add(service);
                return _services;
            }
            set
            {
                //if (_services == null) return;
                _services = value;
                OnPropertyChanged("Services");
                OnPropertyChanged("SelectedServices");
            }
        }

        #endregion

我想我还没有完全理解OnPropertyChanged()。我想每当我调用类似OnPropertyChanged("Services")anything 绑定到属性服务时都会收到通知并获取更新的数据。然而它不是..我做错了什么。除了我的 XAML,您还需要哪些信息?

【问题讨论】:

  • 向我们展示您的 ViewModel。
  • 您需要更新服务的属性吗?如果是,您需要在 ViewModel 上实现 INotifyPropertyChanged
  • 正确绑定 DataGrid.Itemssource。对于 ViewModel 属性,设置 INotifyPropertyChanged 接口。它用于通知控件属性值已更改。一旦检查 Binding="{Binding DisplayName, , UpdateSourceTrigger=PropertyChanged, Mode=TwoWay }"/>
  • 这只是服务属性。还有一个客户和计算机部分。
  • 那么你遇到了什么错误?

标签: c# wpf data-binding datagrid


【解决方案1】:

你应该改变的一件事是:

        set
        {
            if (_selectedServices == null) return;
            _selectedServices = value;
            OnPropertyChanged("SelectedServices");
        }

_selectedServices 最初为 null,并且将保持不变。 设置它总是会失败,因为它总是会返回。

顺便说一下,我建议你也总是使用花括号来表示 if。总是把你的陈述放在下一行。

  if (_selectedServices == null) 
     {
         // this is a terrible idea because it will always be true and your setter stops the property being set
          return;
     }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2010-11-20
    • 1970-01-01
    相关资源
    最近更新 更多