2013-02-21 118 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

相關問題