2

内部にチェックボックスがある単純なコンボボックスがあります。

<ComboBox Height="23" HorizontalAlignment="Left" Margin="158,180,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" ItemsSource="{Binding collection}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <CheckBox Content="{Binding Name}"></CheckBox>
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

データ コンテキストは単なるコード ビハインドであり、それをテストするために次のコードを使用します。

public ObservableCollection<Foo> collection { get; set; }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        collection = new ObservableCollection<Foo>();
        this.comboBox1.ItemsSource = collection;
        Foo f = new Foo("DSD");
        collection.Add(f);
    }

コードにあるように ItemsSource を設定すると正常に動作しますが、Xaml で ItemsSource を設定したいのですが、上記の Xaml を使用しても動作しません。また、Path = "" に設定しようとしました。理由を知っている人はいますか?

ありがとう

4

4 に答える 4

3

コントロールに DataContext を割り当てる必要があります。何かのようなもの:

var window = new Window1();
window.DataContext = new WindowDC();
window.Show();

クラスにはコンボボックスがWindow1含まれ、WindowDC は次のようになります。

public class WindowDC
{ 
   public ObservableCollection<Foo> collection { get; set; }
}

これがどのように機能するかです。

実際に行うことは、collectionコントロール クラスに配置し、データ コンテキストをコンボボックスのみに設定することです。

ただし、テスト目的で、コントロール コンストラクターに Combox.Datacontext を設定することはできます。

于 2011-06-09T11:52:54.923 に答える
2

WPF のバインディングには常にソースがあります。バインディング自体でソースを指定しない場合は、コントロールの DataContext またはその祖先が暗黙的に使用されます。したがって、分離コード ファイルのプロパティにバインドする場合は、DataContext を、collectionプロパティを含むクラスのオブジェクトに設定する必要があります。あなたの場合、これは Window ( this) のインスタンスです。

DataContext = これ;

コメンターが指摘したように、コード ビハインド ファイル内にビジネス ロジックやデータを配置するのは、良いスタイルとは見なされません。したがって、collectionプロパティを含み、 を初期化するために使用できる別のクラスを作成することを検討してくださいDataContext。より大きなアプリケーションを作成している場合は、データバインディングを使用してビューとモデルをより適切に分離する MVVM などのパターンを検討する必要があります。

編集:順序を変更し、フィードバックを組み込みました

于 2011-06-09T11:52:18.413 に答える
0

コレクションを更新するたびにコンボのアイテムソースを更新し続けるINotifyPropertyChangedでプロパティを作成する必要があるXAMLでアイテムソースを設定するのと同じようにコンボのソースが更新されるため、コードビハインドでコンボのアイテムソースを設定しているときに機能しますこのプロパティを介して..

 private ObservableCollection<Foo> _Collection;
 public ObservableCollection<Foo> Collection 
{ 
get
{
return collection;
}
 set
{
collection = value;
OnPropertyChanged("Collection");
}

ボタンのクリックでコレクションを埋めているので、そのコレクションをプロパティに設定するだけです..

 _Collection = new ObservableCollection<Foo>();
 Foo f = new Foo("DSD");
 _Collection .Add(f);
  Collection = _Collection ; //here property call OnPropertyChange 

同様に、任意のコントロールにデータを提供できます。INotifyPropertyChanged プロパティのゲームです。これがあなたを助けることを願っています

于 2011-06-09T14:10:10.790 に答える
0

collectionコード ビハインドにパブリック プロパティが存在することを確認します。

コードビハインドでも行うthis.DataContext = this

最後にINotifyPropertyChanged、アイテムを追加したらコレクションを変更したことをビューに伝えるために実装します

public ObservableCollection<Foo> Collection 
{ 
get
    {
    return collection;
    }
 set
    {
    collection = value;
    OnPropertyChanged("Collection");

    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        collection = new ObservableCollection<Foo>();
        //this.comboBox1.ItemsSource = collection;
        Foo f = new Foo("DSD");
        collection.Add(f);
        OnPropertyChanged("Collection");
    }
于 2011-06-09T11:58:21.827 に答える