2013-02-21 112 views
0

我的GridViewComboBox ItemsSource是一个可观察的联系人集合。它将在两列中显示FullName和PhoneExtension。该组合框是我的Telerik WPF RadGridView中的一个列。该GridViewComboBoxColumn(不工作)XAML看起来是这样的:如何将GridViewComboBoxColumn绑定到多个字段?

<telerik:GridViewComboBoxColumn Name="contactsComboBox" Header="Contact" 
    DisplayMemberPath="FullName" 
    SelectedValueMemberPath="FullName" 
    ItemsSource="{Binding ContactListObservable}" 
    DataMemberBinding="{Binding PhoneExtension}" > 

    <telerik:GridViewComboBoxColumn.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="Auto" /> 
       </Grid.ColumnDefinitions> 

       <TextBlock Text="{Binding FullName}" /> 
       <TextBlock Text=" Phone: " Grid.Column="1" /> 
       <TextBlock Text="{Binding PhoneExtension}" Grid.Column="2" /> 
      </Grid> 
     </DataTemplate> 
    </telerik:GridViewComboBoxColumn.ItemTemplate> 
</telerik:GridViewComboBoxColumn> 

我想结合这两个全名和PhoneExtension但似乎我只可以在DataMemberBinding一个领域。我不确定DisplayMemberPath或SelectedValueMemberPath中的属性。

我也愿意改用结合的事件。如果您可以同时显示AddHandler和组合框的SelectionChangedEvent的代码,那么将非常感激。

如何将我的多列GridViewComboBox绑定到多个字段?要做到这一点

回答

0

这是我如何解决这个问题(我回答我的问题)。

首先这里是我使用的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> 

通知我利用了MultibindingCellTemplate(获取或设置数据模板在视图模式的细胞)和CellEditTemplate(获取或设置数据模板,在编辑模式下电池)。由于我已经没时间了,我让代码为自己说话。如果您需要一些澄清,请留下评论或发布新的堆栈溢出问题,如果这太混乱。我非常感谢SO社区。你摇滚!

0

在一个方式重写ToString()方法,另一个是使用转换器。

public partial class MainWindow 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = this; 
     Students = new ObservableCollection<Student>(); 
     Students.Add(new Student() { Name = "abc", RollNo = 1, Course = "MCA" }); 
     Students.Add(new Student() { Name = "xyz", RollNo = 1, Course = "MCA" }); 
     Students.Add(new Student() { Name = "pqr", RollNo = 1, Course = "MCA" }); 
     Students.Add(new Student() { Name = "stu", RollNo = 1, Course = "MCA" }); 
    } 
    public ObservableCollection<Student> Students { get; set; } 
} 

public class Student 
{ 
    public string Name { get; set; } 
    public string Course { get; set; } 
    public int RollNo { get; set; } 

    public override string ToString() 
    { 
     return this.Name + " " + this.Course; 
    } 
} 

<ComboBox ItemsSource="{Binding Students}"/> 

另一种方法是使用转换器像

public class MyConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 

     if (value is Student) 
      return ((Student)value).Name + " " + ((Student)value).Course; 
     else 
      return null; 

    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

我希望这会给你一个想法。

+0

我想绑定是双向的。姓名和电话被保存到单独的数据库字段。所以在转换器,我需要ConvertBack代码? – DeveloperDan 2013-02-21 15:28:03

+0

你可以很容易地从你选择的项目中提取它们,我认为将有任何需要转换回来。 – ethicallogics 2013-02-21 15:54:19

+0

如何编写GridViewComboBox绑定语句,以便在用户选择联系人时将它绑定到FullName和PhoneExtension字段? – DeveloperDan 2013-02-21 16:26:05

0

我认为使用MultiBinding与MultiValueConverter应该为你做的伎俩。请参阅例如在this MSDN page

的例子显示了如何将文本属性绑定到2个绑定属性计算的值名字&名字

<telerik:GridViewComboBoxColumn 
        ItemsSource="{Binding}"> 
    <telerik:GridViewComboBoxColumn.DisplayMemberBinding> 
     <MultiBinding Converter="{StaticResource myNameConverter}" 
        ConverterParameter="FormatLastFirst"> 
     <Binding Path="FullName"/> 
     <Binding Path="PhoneExt"/> 
     </MultiBinding> 
    </telerik:GridViewComboBoxColumn.DisplayMemberBinding> 

DisplayMemberBinding好像你想要的组合框下拉显示什么。 DataMemberBinding是您想要获取/设置回商店的内容。例如您可以向用户显示'电话号码,分机',但在选择更改时,只有PhoneExt值会被修改。

+0

谢谢。我认为你有一个错字...没有DisplayMemberBinding属性。当我将它更改为DataMemberBinding时,出现以下异常:DataBindingBinding不允许MultiBinding,因为它不是依赖项属性。我将尝试在属性DisplayMemberPath上使用MultiBinding。我也会研究你的链接。 – DeveloperDan 2013-02-21 15:16:14

+0

@DeveloperDan - 是的,我在那里猜测 - 不用telerik控件。我只是希望对称。 – Gishu 2013-02-22 07:03:30

相关问题