3

ビュー モデルからデータグリッドにデータをプルする Silverlight アプリがあります。VM は Mef 経由で公開されます。コンボボックスを持つ詳細グリッドもあります。vm には、コンボボックスの値を入力するためのデータも含まれています。最初のロードでは、すべてが正常に機能し、コンボボックスで選択されたアイテムは正しく、代替値を選択できます。ただし、メインのデータ グリッドを並べ替えると (sort=true を許可)、コンボ ボックスで選択した値のバインドが消えます。コンボボックスにはまだデータが取り込まれていますが、何も選択されていません。

以前にこの問題に遭遇した人はいますか? これを解決する方法がわかりません。

ありがとう

4

5 に答える 5

1

Shaggy、先日、非同期 ComboBox の読み込みをセットアップしようとして、これに気付きました。なんらかの理由で、ComboBox がバインディングをドロップしているように見えます (しかし、既にご存知のとおりです)。とにかく、これらの問題のいくつかに対処するこの投稿をまとめました。それが役立つかどうか教えてください。

http://blogs.msdn.com/kylemc/archive/2010/06/18/combobox-sample-for-ria-services.aspx

カイル

于 2010-06-22T22:14:51.717 に答える
0

コンボボックスのデータをどのように収集していますか? 文字列のリストですか、それとも特定のオブジェクトのリストですか? 発生する可能性があるのは、並べ替えによってコンボボックス内またはデータの各行内に別のオブジェクトのセットが作成され、選択されたアイテムが参照と一致しなくなったということです。コード例を投稿できますか?

于 2010-05-14T13:54:49.597 に答える
0

コンボボックスのコードは次のとおりです

 <TextBlock>Status</TextBlock>
        <ComboBox x:Name="CB_Status"   ItemsSource="{Binding Status}" SelectedValuePath="StatusId" SelectedValue="{Binding CurrentCall.StatusId, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" ItemTemplate="{StaticResource StatusTemplate}" />
        <TextBlock>Priority</TextBlock>
        <ComboBox x:Name="CB_Priority"  ItemsSource="{Binding Priorities}" SelectedValuePath="PriorityId" SelectedValue="{Binding CurrentCall.PriorityId, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" ItemTemplate="{StaticResource PriorityTemplate}"/>
        <TextBlock>Issue Type</TextBlock>
        <ComboBox x:Name="CB_IssueType" ItemsSource="{Binding IssueType}" SelectedValuePath="IssueTypeId" SelectedValue="{Binding CurrentCall.IssueTypeId, Mode=TwoWay,NotifyOnValidationError=True, ValidatesOnExceptions=True}" ItemTemplate="{StaticResource IssueTemplate}" />

データは VM から取得され、データは最初に非同期呼び出しを使用して呼び出され、変数は次のように入力されます。

   private IEnumerable<Priority> _priorities;

    public IEnumerable<Priority> Priorities
    {
        get { return _priorities; }
        set
        {
            if (value != _priorities)
            {
                _priorities = value;
                this.RaisePropertyChanged("Priorities");
            }
        }
    }
 private IEnumerable<Status> _status;

    public IEnumerable<Status> Status
    {
        get { return _status; }
        set
        {
            if (value != _status)
            {
                _status = value;
                this.RaisePropertyChanged("Status");
            }
        }
    }


    private IEnumerable<IssueType> _issueType;

    public IEnumerable<IssueType> IssueType
    {
        get { return _issueType; }
        set
        {
            if (value != _issueType)
            {
                _issueType = value;
                this.RaisePropertyChanged("IssueType");
            }
        }
    }

したがって、コンボボックスはさまざまなエンティティの IEnumerable コレクションです。問題は、親テーブルの並べ替え時に、コンボ ボックスで選択した値が失われますが、コンボ ボックスのデータはそのまま残ります。フィドラーを介して、コンボボックスのデータをフェッチするための後続の呼び出しがないことがわかります。

于 2010-05-14T14:56:27.823 に答える
0

以前に SelectedValue で考えたことと問題の 1 つは、コンボックス、データグリッドなどの状態が次のように変化したときです。フォーカスの喪失、再描画、およびその他のいくつかにより、SelectedValue が null に変更されます。値を選択すると、VM の SelectedValue (バインドされたプロパティ) が設定される可能性があります。ただし、グリッドが並べ替えを行うと、VM に SelectedValue を「null」に設定するように指示します。したがって、並べ替えの後、コンボボックスはデフォルト値に設定されます。

試すことができるのは、SelectedValue プロパティの 'set' の 1 つにブレークポイントを設定し、値が null の場合は Debug.Assert 中に値が設定される頻度を確認することです。

于 2010-05-15T21:32:57.613 に答える
0

ここでの設定はわかりませんが、データグリッドが呼び出しのリストで、CurrentCall が選択された項目である場合、Element Binding を使用できませんか? 例えば

<ComboBox x:Name="CB_Status"   
                      ItemsSource="{Binding Status}" 
                     SelectedItem="{ Path=SelectedItem.Status, Mode=TwoWay, ElementName=YOUR_DATAGRID}" 
                     ItemTemplate="{StaticResource StatusTemplate}" /> 

グリッドのデータコンテキストは VM に (または何かに) バインドされていると想定しているIEnumerable<Call>ため、ソートすると新しいコレクションが生成されると思います (.Sort や order などと言った場合のように)。

これは、実際の例からの簡単なカットです(この場合、データグリッドではなくリストボックスを使用しています)

<ComboBox 
   DisplayMemberPath="DisplayName"
   SelectedItem="{Binding Path=SelectedItem.Individual.IndividualNameTitle, 
                   Mode=TwoWay, ElementName=AccountList}"
   ItemsSource="{Binding Path=IndividualNameTitles}">
</ComboBox>

それが役に立てば幸い。

于 2010-05-18T05:29:33.167 に答える