【发布时间】: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