Wpf 为什么不在此多重绑定上调用ConvertBack?

Wpf 为什么不在此多重绑定上调用ConvertBack?,wpf,xaml,binding,multibinding,Wpf,Xaml,Binding,Multibinding,列出联系人的组合框使用多重绑定绑定到FullName和PhoneExtension。调用了IMultiValueConverter的Convert方法,但未调用ConvertBack。为什么?组合框正确显示列表,但所选内容未保存。当我离开选项卡时,它将消失 背景: 1) 联系人列表来自一个web服务,并放在一个可观察的集合ContactListObservable中。我没有使用ViewModel PhoneBookService phoneBookService = new PhoneBookS

列出联系人的组合框使用多重绑定绑定到FullName和PhoneExtension。调用了IMultiValueConverter的Convert方法,但未调用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;

我在这方面花了太多的时间,所以我非常感谢你能提供的任何帮助

更多背景:

包含my combobox的datagrid每行包含一个实体框架联系人对象,并包含其他联系人字段。下面是一些正在工作的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>


TextBlock永远不会更改其Text属性,因此没有理由调用ConvertBack方法。您需要绑定到组合框的SelectedItem或Text属性才能获得更新。

我在回答自己的问题,详细说明Code裸体的准确答案将此添加到问题XAML中,一切正常-调用ConvertBack,并根据需要保存FullName和PhoneExtension:

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

谢谢你的快速回复

你能详细说明一下吗?如何通过绑定到SelectedItem或Text来显示组合框列表并保存FullName和PhoneExtension?一些示例代码可以帮助我理解。谢谢。@DeveloperDan-组合框有两个方面。首先是显示供选择的项目(看起来您的设置正确),然后是选择本身。选择由SelectedItem属性指示,但Text属性也可以有用户的输入(如果IsEditable为true)。您的示例没有指出DataGrid所显示的数据,因此很难得出任何结果,只有一个。如果你能提供更多的细节,我可以详细说明我的答案。我已经为我的问题添加了更多的背景。网格显示保存到名为contact的实体框架实体的多个联系人字段。当组合框文本被简单地绑定到全名时,一切都可以工作。当我尝试使用多重绑定以便每个全名都有一个关联的PhoneExtension时,问题就出现了。
<ComboBox.SelectedItem>
    <MultiBinding Converter="{StaticResource combinedNameAndPhoneExtensionConverter}">
        <Binding Path="FullName" UpdateSourceTrigger="PropertyChanged"/>
        <Binding Path="PhoneExtension" UpdateSourceTrigger="PropertyChanged"/>
    </MultiBinding>
</ComboBox.SelectedItem>
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;
    }

}