将可观察集合模型属性绑定到网格中的下拉列



我正在使用syncfusion网格控件,但我认为我的这个问题是一般性的?

我将此网格绑定到一个客户列表。这些属性(姓名、电子邮件、联系方式等)在网格内显示Ok。

现在我预计一个客户可以有一个或多个地址(尤其是如果他们是商业分支机构)。

因此,我在网格中也有一个下拉列类型来显示潜在的1+地址。

问题是这并没有显示出任何东西。

所以。。

我的XAML是:

<syncfusion:SfDataGrid 
ItemsSource="{Binding Path=HeartBeat.ConciseCustomer}">
<syncfusion:SfDataGrid.Columns>
<syncfusion:GridTextColumn MappingName="Customer.FirstName" HeaderText="First Name" Width="150" />
<syncfusion:GridTextColumn MappingName="Customer.LastName" HeaderText="Last Name" Width="150" />
<syncfusion:GridComboBoxColumn MappingName="Address1"  DisplayMemberPath="Address1" ItemsSource="{Binding Addresses}" />
<syncfusion:GridTextColumn MappingName="Customer.ContactNo1" HeaderText="Contact No" Width="130" />
<syncfusion:GridTextColumn MappingName="Customer.EmailAddress1" HeaderText="Email Address"  Width="300"/>
</syncfusion:SfDataGrid.Columns>
</syncfusion:SfDataGrid>

我的虚拟机是…

private ObservableCollection<ConciseCustomer> _conciseCustomer;
public ObservableCollection<ConciseCustomer> ConciseCustomer
{
get => _conciseCustomer;
set
{
_conciseCustomer = value;
RaisePropertyChanged("ConciseCustomer");
}
}

我的型号是:

public class Address
{
public Int64 AddressId { get; set; }
public string AddressRef { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string Address3 { get; set; }
public string Town { get; set; }
public string PostCode { get; set; }
public string County { get; set; }
public string Country { get; set; }
public string CustomerRef { get; set; }
public bool Active { get; set; }
public string AccountRef { get; set; }
public DateTime? ServerTs { get; set; }
public string ServerRef { get; set; }
}
public class Customer
{
public Int64 CustomerId { get; set; }
public string CustomerRef { get; set; }
public string CustomerFriendlyRef { get; set; }
public string Title { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public string ContactNo1 { get; set; }
public string ContactNo2 { get; set; }
public string ContactNo3 { get; set; }
public string EmailAddress1 { get; set; }
public string EmailAddress2 { get; set; }
public DateTime Doe { get; set; }
public bool Active { get; set; }
public string AccountRef { get; set; }
public DateTime? ServerTs { get; set; }
public string ServerRef { get; set; }
}

VM:

public class ConciseCustomer : VMS
{
private Customer _customer;
private ObservableCollection< Address> _addresses;
public Customer Customer
{
get => _customer;
set
{
_customer = value;
RaisePropertyChanged("Customer");
}
}
public ObservableCollection<Address> Addresses
{
get => _addresses;
set
{
_addresses = value;
RaisePropertyChanged("Addresses");
}
}
}
public class ApplicationViewModel : VMS
{
public ApplicationViewModel()
{
HeartBeat = new HeartBeat
{
BookingWizard = new BookingWizard(),
LookUps = new LookUps()
};
}
private HeartBeat _heartBeat;
public HeartBeat HeartBeat
{
get => _heartBeat;
set
{
_heartBeat = value;
RaisePropertyChanged("HeartBeat");
}
}
}

输出窗口中的错误是?

System.Windows.Data错误:40:BindingExpression路径错误:在对象"ApplicationViewModel"(HashCode=59362130)"上找不到"Addresses"属性。BindingExpression:Path=地址;DataItem="ApplicationViewModel"(哈希代码=59362130);目标元素是"GridComboBoxColumn"(哈希代码=54875957);目标属性为"ItemsSource"(类型为"IEnumerable")

虽然我理解这个错误,但我不知道如何"修复"它。我如何使"子"项源与父项源"相关"?

您可以尝试用GridTemplateColumn:替换GridComboBoxColumn

<syncfusion:GridTemplateColumn MappingName="Address1" 
syncfusion:FocusManagerHelper.WantsKeyInput="True">
<syncfusion:GridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Address1}" />
</DataTemplate>
</syncfusion:GridTemplateColumn.CellTemplate>
<syncfusion:GridTemplateColumn.EditTemplate>
<DataTemplate>
<ComboBox SelectedItem="{Binding Address1}"  
ItemsSource="{Binding Addresses}"
DisplayMemberPath="Address1" />
</DataTemplate>
</syncfusion:GridTemplateColumn.EditTemplate>
</syncfusion:GridTemplateColumn>

但从数据模型来看,还不清楚应该如何将Address连接到Customer

最新更新