0

問題は、実行時にアイテムのコレクションを変更していて、コンボボックスを更新して新しいアイテムを表示できないことです。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 メンバー ?

4

2 に答える 2

1

UpdateComboBoxContentその原因には2つの問題があります。

まず、プロパティが呼び出されますがComboBoxSource、メソッドでは、「ComboBox List Source」で変更されたプロパティを呼び出します。

次に、をオーバーライドする必要はまったくありませんObservableCollectionObservableCollection自身でバインディングを通知できます。ComboBoxSource.Clear()変更されたアイテムのみを更新できない場合は、オーバーライドする代わりに、呼び出して新しいデータを入力します。

また、myComboBox.itemssource = ComboBoxSource;そうすることでバインディングを壊すことは絶対にしないでください。コード ビハインドを使用してプロパティをバインドする場合は、http: //msdn.microsoft.com/en-us/library/ms742863.aspxを参照してください。

于 2013-09-09T08:55:32.953 に答える
0

どうやら、プロパティ名 ComboBoxSource と PropertyCHanged イベント パラメータをバインディングと混同しているようです。次のように、すべての場所で ComboBoxSource のような同じ名前を使用する必要があります。

public ObservableCollection<Member>  ComboBoxSource;

public UpdateComboBoxContents()
{
    List<Member> newList;

    // Omitted Code to retrieve list from datasource..

    ComboBoxSource = new ObservableCollection<Member>(newList);        

    // I’ve also tried..
    OnPropertyChanged("ComboBoxSource");


}

<ComboBox Name="myComboBox" SelectedValuePath="PublicID"
DisplayMemberPath="Description" ItemsSource="{Binding ComboBoxSource,
UpdateSourceTrigger=PropertyChanged}"/>
于 2013-09-09T08:55:10.407 に答える