WPF и DataGridComboBox
Я попал в такой беспорядок с использованием Combobox в сетке WPF.
Я пытаюсь реализовать простую форму Контакта, которая позволяет пользователю выбрать Приветствие в Combobox.
class Contact
{
..
public int SalutationID
{
get { return _salutationid;}
set { _salutationid = value; }
}
}
class Salutation
{
public int ID
{
get { return _id;}
}
public string Description
{
get { return _description; }
}
}
..
and in code
ObservableCollection<Contact> Contacts = GetContacts();
ObservableCollection<Salutation> Salutations = GetSalutations();
grid.ItemsSource = Contacts;
colSalutations.ItemsSource = Salutations;
Соответствующий XAML:
<DataGridComboBoxColumn x:Name="colSalutation" Header="Title" SelectedValueBinding="{Binding SalutationID}" SelectedValuePath="ID" DisplayMemberPath="Description" />
Я получаю запись в столбце "Приветствие" только для последней записи в сетке - но эта строка недопустима - ее там не должно быть (вся строка, кроме этой записи, пуста). Когда я щелкаю, чтобы редактировать (в любой строке), появляется комбинированное окно со всеми правильными записями, но когда я выбираю элемент, он исчезает, и поле остается пустым.
Я посмотрел на множество примеров, и я, кажется, делаю все хорошо, но, очевидно, нет.
Может кто-нибудь показать мне, где я иду не так? Как вы, наверное, поняли, я новичок в WPF.
Спасибо
Я также попробовал это:
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="IsDropDownOpen" Value="True" />
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding Path=Description}"></TextBlock>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="IsDropDownOpen" Value="True" />
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding Path=Description}"></TextBlock>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
Но это, хотя отображение комбинированного списка (и все еще ничего для любых других строк) вместе с правильными данными, не позволит мне выйти из текущей строки, и я понятия не имею, почему!
Надеюсь, чтобы прояснить ситуацию, ниже приведен полный текст XAML:
</Grid.Resources>
<DockPanel>
<DockPanel Name="ButtonPanel" DockPanel.Dock="Top" LastChildFill="false">
<Button DockPanel.Dock="Left" Content="Save" x:Name="btnSave" Click="btnSave_Click" Height="28"/>
<Button DockPanel.Dock="Right" Content="Cancel" x:Name="btnCancel" Click="btnCancel_Click" Height="28"/>
</DockPanel>
<ProgressBar DockPanel.Dock="Top" Name="pbLoading" Minimum="0" Maximum="1" Height="16" IsIndeterminate="True" Margin="0,0,0,16" />
<DataGrid DockPanel.Dock="Top" x:Name="dgContacts" AutoGenerateColumns="false" CellEditEnding="dgContacts_CellEditEnding" PreviewKeyDown="dgContacts_PreviewKeyDown" BeginningEdit="dgContacts_BeginningEdit" >
<DataGrid.Columns>
<mui:DataGridTextColumn x:Name="colFirstName" Header="First Name" Binding="{Binding fldForename}"/>
<mui:DataGridTextColumn x:Name="colLastName" Header="Last Name" Binding="{Binding fldSurname}" />
<mui:DataGridTextColumn x:Name="colEmailName" Header="Email" Binding="{Binding fldEmail}"/>
<mui:DataGridTextColumn x:Name="colPhoneNumber" Header="Telephone" Binding="{Binding fldPhoneNumber}" />
<mui:DataGridComboBoxColumn
x:Name="colSalutation" Header="Title"
SelectedItemBinding="{Binding SalutationID}" SelectedValuePath="ID"
DisplayMemberPath="Description">
</mui:DataGridComboBoxColumn>
<mui:DataGridTextColumn x:Name="colAddressLine1" Header="Address 1" Binding="{Binding colAddressLine1}" />
<mui:DataGridTextColumn x:Name="colAddressLine2" Header="Address 2" Binding="{Binding colAddressLine2}" />
<mui:DataGridTextColumn x:Name="colAddressLine3" Header="Address 3" Binding="{Binding colAddressLine3}" />
<mui:DataGridTextColumn x:Name="colCity" Header="City" Binding="{Binding fldCity}" />
<mui:DataGridTextColumn x:Name="colCounty" Header="County" Binding="{Binding fldCounty}" />
<mui:DataGridTextColumn x:Name="colPostCode" Header="Postcode" Binding="{Binding fldPostCode}" />
<mui:DataGridTextColumn x:Name="colCountry" Header="Country" Binding="{Binding fldCountry}" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Grid>
</UserControl>