問題は、実行時にアイテムのコレクションを変更していて、コンボボックスを更新して新しいアイテムを表示できないことです。xamlでこれを実現したいと思います。
これを単一のコンボボックスに対して解決し、次にデータグリッドに対しても、datagridComboBoxColumn またはデータテンプレートとしてコンボボックスを含む templatecolumn として解決したいと考えています。
私は次のようなコードを持っています:
public class Member
{
public string PublicID {get; set;}
public string Description {get; set;}
}
public ObservableCollection<Member> ComboBoxSource;
public UpdateComboBoxContents()
{
List<Member> newList;
// Omitted Code to retrieve list from datasource..
ComboBoxSource = new ObservableCollection<Member>(newList);
// If I uncomment the next line, combobox will show new contents:
//myComboBox.itemssource = ComboBoxSource;
// I’ve also tried..
OnPropertyChanged("ComboBoxListSource");
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string Name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(Name));
}
}
どこ:
public partial class MyForm: UserControl, INotifyPropertyChanged
コンボボックスの xaml は次のようになります。
<ComboBox Name="myComboBox" SelectedValuePath="PublicID"
DisplayMemberPath="Description" ItemsSource="{Binding ComboBoxListSource,
UpdateSourceTrigger=PropertyChanged}"/>
INotifyPropertyChangedのバインディングまたは実装を台無しにしていると思います。デバッグでは、ハンドラーが常に null であるため、イベントが発生しないことに気付きました。
この質問の 2 番目の部分 (データグリッドへの実装) については、次のとおりです。
public observableCollection<DatarowWithMember> ListDataRowWithMember;
// Code to populate list..
myDataGrid.Itemsource = ListDataRowWithMember
ここで、DataRowWithMember は、INotifyPropertyChanged を実装し、メンバーの PublicID を指す必要がある MemberID プロパティを持つクラスです。
私はこのxamlを試しました:
<DataGridTemplateColumn Header="Group" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding ComboBoxListSource,
RelativeSource={RelativeSource AncestorType=UserControl}}"
SelectedValue="{Binding MemberID, UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="Description"
SelectedValuePath="PublicID"
IsHitTestVisible="False" SelectionChanged="ComboBoxChanged">
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding ComboBoxListSource,
RelativeSource={RelativeSource AncestorType=UserControl}}"
DisplayMemberPath="Description" SelectedValuePath="PublicID"
SelectedValue="{Binding MemberID,
UpdateSourceTrigger=PropertyChanged}"
SelectionChanged="ComboBoxChanged"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
解決策: 他の人が指摘したように、ComboBoxSource と ComboBoxListSource にタイプミスがありました。これはコードの問題ではなく、この質問を書き出す際の私のエラーです。
出力ウィンドウを確認すると、プロパティ ComboBoxSource が見つからないというバインディングの問題が実際に示されました。私は次のように変更しました:
private ObservableCollection<Member> _ComboBoxSource = new ObservableCollection<Member>()
public ObservableCollection<Member> ComboBoxSource
{
get { return _ComboBoxSource; }
}
そしてそれはうまくいきました。クラス プロパティ vs メンバー ?