这是我如何解决这个问题(我回答我的问题)。
首先这里是我使用的Multibinding类型转换器:
public class CombineFullNameAndPhoneExtensionMultiConverter : IMultiValueConverter
{
public object Convert(object[] values,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture)
{
if (values[0] as string != null)
{
string fullName = (string)values[0] ?? "Unknown";
string phoneExtension = (string)values[1] ?? "Unknown";
string namePlusExtension = fullName.Trim() + " Phone: " + phoneExtension.Trim();
return namePlusExtension;
}
return null;
}
public object[] ConvertBack(object value,
Type[] targetTypes,
object parameter,
System.Globalization.CultureInfo culture)
{
NotesContact c = (NotesContact)value;
string[] returnValues = { c.FullName.Trim(), c.PhoneExtension.Trim() };
return returnValues;
}
}
public class CombineLastNameFirstNameAndPhoneExtensionMultiConverter : IMultiValueConverter
{
public object Convert(object[] values,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture)
{
if (values[0] as string != null)
{
string lastName = (string)values[0] ?? "Unknown";
string firstName = (string)values[1] ?? "Unknown";
string phoneExtension = (string)values[2] ?? "Unknown";
string lastCommaFirstPlusExtension = lastName.Trim() + ", " + firstName.Trim() + " Phone: " + phoneExtension.Trim();
return lastCommaFirstPlusExtension;
}
return null;
}
public object[] ConvertBack(object value,
Type[] targetTypes,
object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
下面是XAML的转换声明:
<local:CombineFullNameAndPhoneExtensionMultiConverter x:Key="combinedFullNameAndPhoneExtensionConverter"/>
<local:CombineLastNameFirstNameAndPhoneExtensionMultiConverter x:Key="combinedLastNameFirstNameAndPhoneExtensionConverter"/>
现在,这里是ComboBox XAML:
<telerik:GridViewComboBoxColumn Name="contactsGridViewComboBox" Header="Contact"
ItemsSource="{Binding ContactListObservable, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}">
<telerik:GridViewComboBoxColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource combinedFullNameAndPhoneExtensionConverter}">
<Binding Path="FullName"/>
<Binding Path="PhoneExtension"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</telerik:GridViewComboBoxColumn.CellTemplate>
<telerik:GridViewComboBoxColumn.CellEditTemplate>
<DataTemplate x:Name="ContactsCellEditTemplate">
<Grid FocusManager.FocusedElement="{Binding ElementName=ContactsTemplateComboBox}">
<telerik:RadComboBox x:Name="ContactsTemplateComboBox" IsSynchronizedWithCurrentItem="False" IsEditable="False" ItemsSource="{Binding ContactListObservable, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" IsDropDownOpen="True" TextSearchMode="Contains" IsFilteringEnabled="True" OpenDropDownOnFocus="True">
<telerik:RadComboBox.SelectedItem>
<MultiBinding Converter="{StaticResource combinedFullNameAndPhoneExtensionConverter}">
<Binding Path="FullName" UpdateSourceTrigger="PropertyChanged"/>
<Binding Path="PhoneExtension" UpdateSourceTrigger="PropertyChanged"/>
</MultiBinding>
</telerik:RadComboBox.SelectedItem>
<telerik:RadComboBox.ItemTemplate>
<DataTemplate>
<TextBlock DataContext="{Binding}">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource combinedLastNameFirstNameAndPhoneExtensionConverter}">
<Binding Path="LastName"/> <Binding Path="FirstName" />
<Binding Path="PhoneExtension"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</telerik:RadComboBox.ItemTemplate>
</telerik:RadComboBox>
</Grid>
</DataTemplate>
</telerik:GridViewComboBoxColumn.CellEditTemplate>
通知我利用了Multibinding,CellTemplate(获取或设置数据模板在视图模式的细胞)和CellEditTemplate(获取或设置数据模板,在编辑模式下电池)。由于我已经没时间了,我让代码为自己说话。如果您需要一些澄清,请留下评论或发布新的堆栈溢出问题,如果这太混乱。我非常感谢SO社区。你摇滚!
我想绑定是双向的。姓名和电话被保存到单独的数据库字段。所以在转换器,我需要ConvertBack代码? – DeveloperDan 2013-02-21 15:28:03
你可以很容易地从你选择的项目中提取它们,我认为将有任何需要转换回来。 – ethicallogics 2013-02-21 15:54:19
如何编写GridViewComboBox绑定语句,以便在用户选择联系人时将它绑定到FullName和PhoneExtension字段? – DeveloperDan 2013-02-21 16:26:05