2

タイトルが示すように; 複合コレクションを使用して、MVVM パターンを使用して観察可能なコレクションにバインドするコンボボックスがあります。

モデルに既存のデータをロードすると、コンボボックスに値が表示されるので、バインディングが機能することがわかります。観測可能なコレクションにアイテムを追加でき、それらがデータ グリッドに表示されるので、観測可能なコレクションの通知プロパティ変更イベントが機能していることがわかります。複合コレクションが「静的リソース」をソースとして使用しているため、機能していないと思われますが、それを動的リソースに変更すると、次のエラーが発生します。

'DynamicResourceExtension' は、タイプ 'Binding' の 'Source' プロパティに設定できません。「DynamicResourceExtension」は、DependencyObject の DependencyProperty でのみ設定できます。

私は解決策を見つけるために何日も検索しましたが、他の人が同様の問題に直面している間、解決策はまだ私の問題を解決していません.

モデルのコードは次のとおりです。

    public class Model : ObservableObject
{
    #region Properties

    private string name;
    public string Name
    {
        get { return this.name; }
        set { this.name = value; }
    }

    private string balance;
    public string Balance
    {
        get { return this.balance; }
        set { this.balance = value; }
    }
    #endregion

私のビューモデル:

public class ViewModel : ObservableObject
{
    private ObservableCollection<Model> modelcollection;
    public ObservableCollection<Model> ModelCollection
    {
        get { return modelcollection; }
        set
        {
            modelcollection= value;
            RaisePropertyChangedEvent("ModelCollection");
        }
    }

    private string _name;
    public string Name 
    {
        get { return _name; } 
        set
        {
            _name = value;
            RaisePropertyChangedEvent("Name");
        }
    }
    private string _balance;
    public string Balance 
    {
        get { return _balance; } 
        set
        {
            _balance = value;
            RaisePropertyChangedEvent("Balance");
        }
    }

最後に、コンボボックスのビューの XAML:

<ComboBox MinWidth="100" SelectedValue="{Binding combovalue, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="Name">
    <ComboBox.Resources>
        <vm:ViewModel x:Key="CollectionKey"/>
    </ComboBox.Resources>

    <ComboBox.ItemsSource>
        <CompositeCollection>
            <CollectionContainer Collection="{Binding ModelCollection, Source={StaticResource CollectionKey}, UpdateSourceTrigger=PropertyChanged}"/>
        </CompositeCollection>
    </ComboBox.ItemsSource>

    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=Name, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

よろしくお願いします。

編集:

だから私はある方向に動いた。正しいか間違っているかはまだ決定されていません。

コンボボックス自体の外にある問題を追跡したと思うので、ここでより多くのコンテキストが必要です。

コモボボックスは、タブ コントロールの 2 番目のタブにあります。各タブ項目には、独自のビュー モデルを指す独自のデータ コンテキストがあります。データは最初のタブに入力され、そのデータが 2 番目のタブのコンボ ボックスに表示されるようにします。

最初のタブにコンボボックスを配置すると、そのコンボボックスは、最初のタブに入力された監視可能なコレクションの変更で更新されます。したがって、(私が思うに) 問題は、2 番目のタブのコンボボックスが同時に 2 つの異なるビュー モデルにバインドしようとしていることです。1 つは項目のソース用で、もう 1 つは選択した値用です。

別のスレッドで、データ コンテキストに x:Reference を使用するという提案がありましたが、その正しい構文を理解できないようです。

あなたがまだこれを読んでいるなら、どんな助けも本当に感謝しています.

4

1 に答える 1

0

結局、他のビューモデルからコンボボックスを設定することはできませんでした。これが可能かどうかはまだわかりません。

最終的にうまくいった解決策は、バインディングに必要なすべてを単一のビュー モデルに結合することでした。これにより、ビュー モデルが少し重くなりましたが、XAML が大幅に削減されたので、それが功を奏したと思います。

于 2015-02-06T14:14:16.307 に答える