2016-03-29 18 views
0

私はwpf c#アプリケーションを持っています。ObservableCollectionにコンボボックスをバインドする

私はコンボボックスを使用しており、itemsourceプロパティをobservableコレクションに設定しています。

私が持っている問題は、このコレクションを変更すると、変更がドロップダウンに反映されないということです。

私は何が間違っているのだろうか?

これは私のクラスのオブジェクトです:

public class JobTicker 
{ 
    public string CustomerRef { get; set; } 
    public string JobRef { get; set; } 
    public int JobId { get; set; } 
    public string CustomerJobDetails { get; set; } 
    public string CustomerName { get; set; } 
} 

私は私のコレクションにバインド:コレクション変数の

ActiveState.JobsActive = new ObservableCollection<JobTicker>('data from a list'); 

は私の宣言:

public static ObservableCollection<JobTicker> JobsActive = new ObservableCollection<JobTicker>(); 

マイコンボボックス(あります私のアプリの起動時に読み込まれる私のuserControlで)

<xctk:WatermarkComboBox x:Name="cboActiveJobs" Grid.Row="1" Grid.Column="2" 
    Width="250" Watermark="Select Customer"   
    DisplayMemberPath="CustomerJobDetails" 
    HorizontalContentAlignment="Center"      
    SelectionChanged="cbo_SelectionChanged" 
    DropDownOpened="cbo_DropDownOpened" 
    DropDownClosed="cbo_DropDownClosed" 
    Style="{StaticResource ComboBoxFlatStyle}" 
    /> 

と後ろの私のコード:

cboActiveJobs.ItemsSource = ActiveState.JobsActive; 

今、私は「ActiveState.JobsActive」を変更した場合、私は変化が私のドロップダウンに反映されることを期待するだろうが、そうではありません。

答えて

2

コードは実際にはバインドしていません。プロパティにコレクションを割り当てるだけです。

コンボボックスのItemsSourceプロパティは、ObservableCollectionからの通知を受信できません。代わりに、これらの通知をリスンしてUI更新を行うには、Bindingクラスのインスタンスが必要です。 Bindingはすべての魔法の場所です。あなたは、背後にあるコードでプログラムを作成し、(下記のリンクを参照)、それを添付しますが、最も簡単で、これまでで最も一般的な方法は、XAMLでバインドしている可能性があり:

<xctk:WatermarkComboBox 

    ItemsSource="{Binding JobsActive}" 

    SelectedItem="{Binding SelectedCustomer}" 

    x:Name="cboActiveJobs" 
    Grid.Row="1" 
    Grid.Column="2" 
    Width="250" 
    Watermark="Select Customer"   
    DisplayMemberPath="CustomerJobDetails" 
    HorizontalContentAlignment="Center"      
    SelectionChanged="cbo_SelectionChanged" 
    DropDownOpened="cbo_DropDownOpened" 
    DropDownClosed="cbo_DropDownClosed" 
    Style="{StaticResource ComboBoxFlatStyle}" 
    /> 

JobsActiveは、ビューのパブリックプロパティでなければなりませんそのコントロールのためにDataContextをモデル化します。そうでない場合、それは動作しません。

あなたにはSelectionChangedイベントがあるので、ビューモデルのプロパティでもあるSelectedCustomerバインディングも追加しました。 Bindingはこれを両方の方法で更新します:あなたのビューモデルでそれを変更すると、コンボボックスの選択が変わります。ユーザーがコンボボックス項目を選択すると、ビューモデルのプロパティ値が変更されます。

private JobTicker _selectedCustomer; 
public JobTicker SelectedCustomer { 
    get { return _selectedCustomer; } 
    set { 
     _selectedCustomer = value; 
     // If you're not in C#6, use this instead: 
     //OnPropertyChanged("SelectedCustomer"); 
     OnPropertyChanged(nameof(SelectedCustomer)); 
    } 
} 

// Implement INotifyPropertyChanged 
public event PropertyChangedEventHandler PropertyChanged; 
protected void OnPropertyChanged(string propName) 
{ 
    var handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propName)); 
    } 
} 

あなたは、これはのviewmodelを記述することなく、すぐに作業を結合取得したいならば、私はそのアプローチをお勧めしませんが、それは絶対になんとかです。 StackOverflowにはいくつかの回答があり、それがうまくいくのに役立ちます:WPF Binding ProgramaticallyHow to programmatically set data binding using C# xaml

+0

これは多く説明します。ありがとうございました:) –

+0

私はVMの実装を見なければならないでしょう。これはあなたが見るwpfの私のために知っている。 –

+0

@AndrewSimpsonああ、そうです。 WPFのほとんどは、ビューモデルからプロパティをバインドすると、はるかに意味があります。それほど多くはありません:実装[INotifyPropertyChanged](https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v = vs.110)。aspx)と火災報知を適切に行います。 UIで消費されるコレクションについては、すでに使用しているObservableCollectionジェネリックを使用してください。おかげさまで –

関連する問題