2011-06-28 25 views
2

我的组合框列表联系人使用MultiBinding绑定到FullName和PhoneExtension。 IMul​​tiValueConverter的Convert方法被调用,但ConvertBack不是。为什么? 组合框正确显示列表,但不保存选择。当我退出时,它消失。为什么在这个MultiBinding上不调用ConvertBack?

背景:

1)联系人列表来自于Web服务,并把可观察集合ContactListObservable在后面的代码。我没有使用ViewModel。

PhoneBookService phoneBookService = new PhoneBookService(); 
PhoneRecordArray pbs = GetCompletePhoneListing(); 
List<PhoneRecord> pbsList = pbs.PhoneArray.ToList(); 

ObservableCollection<Contact> observableContacts = new ObservableCollection<Contact>(); 

foreach(PhoneBookService.PhoneRecord rec in pbsList) 
{ 
    Contact c = new Contact(); 
    c.FullName = rec.Person; 
    c.PhoneExtension = rec.Phone; 
    observableContacts.Add(c); 
} 

ContactListObservable = observableContacts; 

2)组合框位于UserControl上的数据网格中。这对于这个古怪结合的原因:为<local:CombineNameAndPhoneExtensionMultiConverter x:Key="combinedNameAndPhoneExtensionConverter"/>

4)在联系人列表中必须显示未找到遗留数据ItemsSource="{Binding ContactListObservable, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"

3)IMultiValueConverter是UserControl.Resources引用的类。这是通过组合TextBlock来显示数值和ComboBox进行编辑来实现的,使用DataGridTemplateColumn。请参阅this Julie Lerman MSDN article

这里是疯狂的XAML:

<DataGridTemplateColumn x:Name="DataGridContactTemplateColumn" Header="Contact Using Template"> 
<DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <TextBlock> 
      <TextBlock.Text> 
       <MultiBinding StringFormat="{}{0} Ext. {1}"> 
         <Binding Path="FullName"/> 
         <Binding Path="PhoneExtension"/> 
       </MultiBinding> 
      </TextBlock.Text> 
     </TextBlock> 
    </DataTemplate> 
</DataGridTemplateColumn.CellTemplate> 
<DataGridTemplateColumn.CellEditingTemplate> 
    <DataTemplate x:Name="ContactsCellEditingTemplate"> 
     <Grid FocusManager.FocusedElement="{Binding ElementName=ContactsTemplateComboBox}"> 
      <ComboBox x:Name="ContactsTemplateComboBox" IsSynchronizedWithCurrentItem="False" IsEditable="False" IsDropDownOpen="True" ItemsSource="{Binding ContactListObservable, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"> 
       <ComboBox.ItemTemplate> 
        <DataTemplate> 
         <TextBlock DataContext="{Binding}"> 
          <TextBlock.Text>               
           <MultiBinding Converter="{StaticResource combinedNameAndPhoneExtensionConverter}">        
            <Binding Path="FullName" UpdateSourceTrigger="PropertyChanged"/>        
            <Binding Path="PhoneExtension" UpdateSourceTrigger="PropertyChanged"/> 
           </MultiBinding> 
          </TextBlock.Text> 
         </TextBlock> 
        </DataTemplate> 
       </ComboBox.ItemTemplate> 
      </ComboBox> 
     </Grid> 
    </DataTemplate> 
</DataGridTemplateColumn.CellEditingTemplate> 

我已经投入了太多时间来这,所以我会非常感谢你能提供任何帮助。

更多背景:

含有我的组合框数据网格包含每行一个实体框架接触对象和包括附加联系人字段。下面是成功地显示并保存全名,但没有电话分机,我想在组合保存与FullName的一些工作XAML:

<DataGridTemplateColumn x:Name="DataGridContactTemplateColumn" Header="Contact Using Template"> 
    <DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding Path=FullName}"/> 
    </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
<DataGridTemplateColumn.CellEditingTemplate> 
    <DataTemplate x:Name="ContactsCellEditingTemplate"> 
     <Grid FocusManager.FocusedElement="{Binding ElementName=ContactsTemplateComboBox}"> 
      <ComboBox x:Name="ContactsTemplateComboBox" ItemsSource="{Binding ContactListObservable, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" DisplayMemberPath="FullName" SelectedValuePath="FullName" Text="{Binding Path=FullName}" SelectedItem="{Binding Path=FullName}" IsSynchronizedWithCurrentItem="False" IsEditable="False" IsDropDownOpen="True"/> 
     </Grid> 
    </DataTemplate> 
</DataGridTemplateColumn.CellEditingTemplate> 

回答

2

TextBlock的永远不会改变它的Text属性,所以没有理由调用ConvertBack方法。您需要绑定到ComboBox的SelectedItem或Text属性才能获取更新。

+0

你能详细点吗?如何通过绑定到SelectedItem或Text来显示组合框列表并保存FullName和PhoneExtension?一些示例代码会帮助我理解。谢谢。 – DeveloperDan

+0

@DeveloperDan - 组合框有两个方面。首先是项目是选择礼物(它看起来像你已经正确设置了这个设置),然后是选择本身。选择由SelectedItem属性指示,但Text属性也可以具有用户的输入(如果IsEditable为true)。你的例子没有指出DataGrid显示的数据,所以很难想出任何东西,除了[基本示例](http://www.c-sharpcorner.com/UploadFile/mahesh/WPFComboBox10122009073811AM/WPFComboBox.aspx) 。如果你能提供更多的细节,我可以详细说明我的答案。 – CodeNaked

+0

我已经为我的问题添加了更多背景。网格显示保存到实体框架实体的多个联系人字段,称为联系人。当组合框文本被简单地绑定到FullName时,一切正常。当我尝试使用多重绑定时,问题就会出现,因此每个FullName都会有一个关联的PhoneExtension。 – DeveloperDan

0

我在回答我自己的问题来详细说明CodeNaked的准确答案。 添加这问题XAML和一切工作 - ConvertBack被调用,并为需要双方全名和PhoneExtension保存:

<ComboBox.SelectedItem> 
    <MultiBinding Converter="{StaticResource combinedNameAndPhoneExtensionConverter}"> 
     <Binding Path="FullName" UpdateSourceTrigger="PropertyChanged"/> 
     <Binding Path="PhoneExtension" UpdateSourceTrigger="PropertyChanged"/> 
    </MultiBinding> 
</ComboBox.SelectedItem> 

这里是combinedNameAndPhoneExtensionConverter代码:

public class CombineNameAndPhoneExtensionMultiConverter : 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]; 
      string phoneExtension = (string)values[1]; 
      string namePlusExtension = fullName + ", " + phoneExtension; 
      return namePlusExtension; 
     } 
     return null; 
    } 

    public object[] ConvertBack(object value, 
           Type[] targetTypes, 
           object parameter, 
           System.Globalization.CultureInfo culture) 
    { 
     Contact c = (Contact)value; 

     string[] returnValues = { c.FullName, c.PhoneExtension }; 
     return returnValues; 
    } 

} 

感谢CodeNaked您快回复!

相关问题