我刚刚在一个小型 POC 中遇到了这个问题,虽然我认为我让它在一个更大的项目中工作并且我设法找到了原因。不知道它是否有帮助,但这里是他的上下文和解决方案。
尝试将命令绑定到 Xceed 数据网格中的 Button 时出现问题,该 itemSource 绑定在我的 viewModel 中公开的集合上。
风景 :
<UserControl x:Class="UnIfied.Module.UI.Client.Screens.Alerts.AlertsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:DataGrid="clr-namespace:Xceed.Wpf.DataGrid;assembly=Xceed.Wpf.DataGrid" xmlns:xcdg="clr-namespace:Xceed.Wpf.DataGrid.Views;assembly=Xceed.Wpf.DataGrid" xmlns:ThemePack="clr-namespace:Xceed.Wpf.DataGrid.ThemePack;assembly=Xceed.Wpf.DataGrid.ThemePack.1">
<Grid>
<DataGrid:DataGridControl Grid.Column="0"
Name="alertsBlotter"
ItemsSource="{Binding AlertsSource}"
SelectionMode="Single"
NavigationBehavior="RowOnly"
ItemScrollingBehavior="Immediate" ReadOnly="True"
AutoCreateColumns="false">
<DataGrid:DataGridControl.Columns>
<DataGrid:UnboundColumn FieldName="Acquit" Title="Acquit Alert" ReadOnly="True" ShowInColumnChooser="False">
<DataGrid:UnboundColumn.CellContentTemplate>
<DataTemplate>
<Button
DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type DataGrid:DataRow}}}"
Content="X" Command="{Binding AcquitAlertCommand}"/>
</DataTemplate>
</DataGrid:UnboundColumn.CellContentTemplate>
</DataGrid:UnboundColumn>
<DataGrid:Column FieldName="AlertId" ReadOnly="True" Title="Alert Id" IsMainColumn="True" />
<DataGrid:Column FieldName="Time" ReadOnly="True" Title="Creation Time" />
<DataGrid:Column FieldName="AlertStatus" ReadOnly="True" Title="Status" />
<DataGrid:Column FieldName="RelatedTrade" ReadOnly="True" Title="CT Id" />
<DataGrid:Column FieldName="Status" ReadOnly="True" Title="CT Status" />
</DataGrid:DataGridControl.Columns>
<DataGrid:DataGridControl.Resources>
<Style x:Key="{x:Type DataGrid:ScrollTip}" TargetType="DataGrid:ScrollTip">
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGrid:DataGridControl.Resources>
<DataGrid:DataGridControl.View>
<xcdg:TableView>
<xcdg:TableView.Theme>
<ThemePack:WMP11Theme />
</xcdg:TableView.Theme>
</xcdg:TableView>
</DataGrid:DataGridControl.View>
</DataGrid:DataGridControl>
</Grid>
视图模型
class AlertsViewModel : Presenter<IAlerts>
{
private readonly IAlertsService alertsService;
public AlertsViewModel(IAlerts view, IAlertsService aService)
: base(view)
{
alertsService = aService;
view.SetDataContext(this);
}
public ObservableCollection<AlertAdapter> AlertsSource
{
get { return alertsService.AlertsSource; }
}
}
适配器(然后将由数据网格中的一行表示)。中继命令是一个基本的 ICommand 实现。
public class AlertAdapter : BindableObject
{
private readonly RelayCommand acquitAlert;
public AlertAdapter()
{
AlertStatus = AlertStatus.Raised;
acquitAlert = new RelayCommand(ExecuteAqcuiteAlert);
}
public RelayCommand AcquitAlertCommand
{
get { return acquitAlert; }
}
private void ExecuteAqcuiteAlert(object obj)
{
AlertStatus = AlertStatus.Cleared;
}
private static readonly PropertyChangedEventArgs AlertStatusPropertyChanged = new PropertyChangedEventArgs("AlertStatus");
private AlertStatus alertStatus;
/// <summary>
/// Gets or sets the AlertStatus
/// </summary>
public AlertStatus AlertStatus
{
get { return alertStatus; }
set
{
if (AlertStatus != value)
{
alertStatus = value;
RaisePropertyChanged(AlertStatusPropertyChanged);
}
}
}
private static readonly PropertyChangedEventArgs AlertIdPropertyChanged = new PropertyChangedEventArgs("AlertId");
private Guid alertId;
/// <summary>
/// Gets or sets the AlertId
/// </summary>
public Guid AlertId
{
get { return alertId; }
set
{
if (AlertId != value)
{
alertId = value;
RaisePropertyChanged(AlertIdPropertyChanged);
}
}
}
private static readonly PropertyChangedEventArgs StatusPropertyChanged = new PropertyChangedEventArgs("Status");
private ComponentTradeStatus status;
/// <summary>
/// Gets or sets the CtStatus
/// </summary>
public ComponentTradeStatus Status
{
get { return status; }
set
{
if (Status != value)
{
status = value;
RaisePropertyChanged(StatusPropertyChanged);
}
}
}
private static readonly PropertyChangedEventArgs RelatedTradePropertyChanged = new PropertyChangedEventArgs("RelatedTrade");
private Guid relatedTrade;
/// <summary>
/// Gets or sets the RelatedTrade
/// </summary>
public Guid RelatedTrade
{
get { return relatedTrade; }
set
{
if (RelatedTrade != value)
{
relatedTrade = value;
RaisePropertyChanged(RelatedTradePropertyChanged);
}
}
}
private static readonly PropertyChangedEventArgs TimePropertyChanged = new PropertyChangedEventArgs("Time");
private DateTime time;
/// <summary>
/// Gets or sets the Time
/// </summary>
public DateTime Time
{
get { return time; }
set
{
if (Time != value)
{
time = value;
RaisePropertyChanged(TimePropertyChanged);
}
}
}
}
这是我的应用程序尝试创建适配器并将其添加到集合中时生成的异常
System.NotSupportedException 未处理 Message="'CommandConverter' 无法将 'UnIfied.Module.UI.Client.Adapters.RelayCommand' 转换为 'System.String'。" Source="System" StackTrace:在 System.ComponentModel.TypeConverter.GetConvertToException(Object value, Type destinationType) at System.Windows.Input.CommandConverter.ConvertTo(ITypeDescriptorContext context, CultureInfo 文化, Object value, Type destinationType) 在 System.ComponentModel。 TypeConverter.ConvertTo(Object value, Type destinationType) at System.Windows.Controls.ContentPresenter.DefaultTemplate.DoDefaultExpansion(TextBlock textBlock, Object content, ContentPresenter container) (ETC.)
该问题是由于我的数据网格被配置为 AutoCreateColumns(即基于适配器的属性)这一事实引起的。只需将此属性切换为 false,然后一切都恢复正常。
希望这对你们有帮助!
- 布鲁诺