2012-04-02 19 views
0

私はObservableCollectionにバインドされたListBoxを持っており、ListBox.ItemTemplateの中には別のObservableCollectionにバインドされたComboBoxがあります。WPFのリストボックスでバインドされたコンボボックスを更新するにはどうすればよいですか?

私が必要とするのは、ListBoxデータを保存した後でComboBoxを更新することです。保存した後

public ObservableCollection<KeyValue> _KeyValues = null; 
public ObservableCollection<KeyValue> KeyValues 
{ 
    get 
    { 
     if (_KeyValues == null) 
     { 
      // _KeyValues = ... (Database call) 
     } 
     return _KeyValues; 
    } 
} 
public ObservableCollection<KeyValue> _SelectableKeyValues = null; 
public ObservableCollection<KeyValue> SelectableKeyValues 
{ 
    get 
    { 
     if (_SelectableKeyValues == null) 
     { 
      // _SelectableKeyValues = ... (Database call) 
     } 
     return _SelectableKeyValues; 
    } 
} 

と呼ばれる方法:ここでは、C#コード内のプロパティ

<ListBox Name="listBox" HorizontalContentAlignment="Stretch" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding KeyValues, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"> 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Border BorderThickness="1" BorderBrush="Gray" CornerRadius="4" Margin="0,1,1,1" Background="#EEE"> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="50" /> 
        <ColumnDefinition Width="3*" /> 
        <ColumnDefinition Width="70" /> 
        <ColumnDefinition Width="2*" /> 
       </Grid.ColumnDefinitions> 
       <Label Grid.Column="1" Margin="0,1">Value</Label> 
       <TextBox Grid.Column="2" Margin="0,1" Text="{Binding Path=Value}" /> 
       <Label Grid.Column="3" Margin="0,1">Combo 1</Label> 
       <ComboBox Grid.Column="4" Margin="0,1" SelectedValue="{Binding Path=Combo1}" SelectedValuePath="Key" DisplayMemberPath="Value" ItemsSource="{Binding SelectableKeyValues, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" /> 
      </Grid> 
     </Border> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

と:

public void RefreshData() 
{ 
    listBox.Items.Refresh(); 
    _SelectableKeyValues = null; 
} 

Iここで

は私のXAMLです試してみた手動でそのコレクションが、結果は常に同じであるリロードする:コンボボックスに

を私は(私があると確信しています)、新しい要素

を見つけることはありません私が間違って何をやっていますか?

+0

簡単なヒントは、コンボボックスアイテムソースのバインディング – michele

+0

にMode = TwoWayを設定すると読み込み専用のプロパティであるため、機能しません。 – p4bl0

答えて

3

あなたのUserControl(SelectableKeyValues定義を含むクラス)にINotifyPropertyChangedインターフェイスを実装し、内部でRefreshDataメソッドraisePropertyChangedイベントを "SelectableKeyValues"をイベント引数のコンストラクタパラメータとして使用します。 ObservableCollectionを使用すると、コレクションを変更せずに置き換えるため、この場合は役に立ちません。 コード例が必要かどうかお知らせください

+0

完璧!ありがとう、私はUserControlが "既に処理された"プロパティ変更を持っているか分からなかった – p4bl0

関連する問題