将WPF ComboBox绑定到实体

0 data-binding wpf combobox entity-framework

好吧,我已经搜索出了Interwebs的内容,似乎无法找到这个权利.我有一个ComboBox绑定到EntityFramework实体的CollectionViewSource.显示屏是显示名/姓的模板.问题是,当选择一个项目时,组合框的显示== object.ToString()(即MyCompany.Data.Professional)而不是有用的东西.

我确定我在这里错过了一处房产.ri是UserControl,SelectedPhysician是DependencyProperty

<ComboBox Grid.Column="1" Grid.Row="4"  x:Name="cmbReferringPhys"
      IsEditable="{Binding IsReadOnly}"
      ItemsSource="{Binding Source={StaticResource ProfessionalLookup}}"                                           
      SelectedItem="{Binding ElementName=ri, Path=SelectedPhysian, Mode=TwoWay, UpdateSourceTrigger=LostFocus, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}"                                            
      HorizontalAlignment="Left" VerticalAlignment="Top" Height="19.277" Width="300" 
      IsSynchronizedWithCurrentItem="True"
      SelectionChanged="ReferringPhy_SelectionChanged" TabIndex="4">
 <ItemsControl.ItemTemplate>
   <DataTemplate>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100" />
                <ColumnDefinition Width="120" />                                
            </Grid.ColumnDefinitions>
            <TextBlock Text="{Binding FirstName}" Grid.Column="0"  Margin="4,0" />
            <TextBlock Text="{Binding LastName}"  Grid.Column="1" Margin="4,0"/>
        </Grid>                                                                   
    </DataTemplate>
</ItemsControl.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)

olt*_*man 5

你可以使用转换器(教程),但这可能会过度使用它.我建议使用ComboBox的DisplayMemberPath属性.

要使用转换器,您需要创建一个转换器类(实现IValueConverter的转换器类.)您的代码将如下所示:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    MyCompany.Data.Professional prof = (MyCompany.Data.Professional)value;

    if (prof == null)
    {
        return string.Empty;
    }
    else
    {
        return string.Format("{0} {1}", prof.First, prof.Last); //or however you want to format this
    }  
}

// If you'll ever need to convert back from a string to a Professional,
// implement that logic here
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    return null;
}
Run Code Online (Sandbox Code Playgroud)

在XAML中,你会做这样的事情:

<ComboBox>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Converter={StaticResource [ConverterClassName]}}" /> 
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)

编辑编辑:在这种情况下,我认为您不需要使用ConvertBack,因为您可以通过将ComboBox.SelectedItem强制转换为Professional来获取所选对象.