0

以下に説明する問題を解決するために、かなりの時間を費やしました。

MVVM WPF アプリケーションで定義された DataGrid を取得しました。削除された XAML コードは次のようになります。

<DataGrid AutoGenerateColumns="False" Name="dgdSomeDataGrid" SelectedItem="{Binding SelectedSomeItem, Mode=TwoWay}" ItemsSource="{Binding SomeItemCollection}">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=Id}" Header="ID" />
        <DataGridTextColumn Header="Titel" Binding="{Binding Path=Title}" />
        <DataGridTextColumn Header="Status" Binding="{Binding Path=State}" />
    </DataGrid.Columns>
</DataGrid>

関連する ViewModel には、次のような対応するプロパティがあります。

public WorkItemForUi SelectedSomeItem
{
    get
    {
        return SomeObject.SelectedSomeItem;
    }
    set
    {
        SomeObject.SelectedSomeItem = value;
        OnPropertyChanged( "SelectedSomeItem" );
    }
}

私のコントローラーには次のものがあります。

private void MainWindowViewModelPropertyChanged( object sender, PropertyChangedEventArgs e )
{
    if ( e.PropertyName == "SelectedSomeItem" )
    {
        UpdateSelectedSomeItem();
    }
}

私が通常やりたいことは、選択したアイテムを から取得し、DataGridそのアイテムに関する詳細情報を外部データ ストア (この場合は TFS) から取得し、その追加情報を TextBox に表示することです。

これはすべて期待どおりに機能しますが、問題は MainWindowViewModelPropertyChanged メソッドが 1 回ではなく 2 回呼び出されることです。

プロパティが 2 回設定されるように設計されている可能性がありSelectedItemますが、私が見つけた多くの情報が少し矛盾しているため、よくわかりません (また、Windows フォームまたは WPF のどちらが正しいかはっきりしない場合もあります)。意味)。

SelectionChanged イベント ハンドラーが に対して定義されDataGridIsSelectedプロパティが使用されているという提案をいくつか見てきましたが、私の知る限り、データ バインディングのためにこれは必要ないはずです。

Update MainWindowController の一部として、MainWindowViewModelPropertyChanged ハンドラーを参照する Initialize メソッドがあります。

    public void Initialize( string tfsProjectCollection )
    {
        InitializeCommands();
        InitializeViewModel();
        AddWeakEventListener( m_MainWindowViewModel, MainWindowViewModelPropertyChanged );
    }

私の問題の原因は何ですか?

4

2 に答える 2

0

ApplicationControllerさて、これにもう少し時間を費やした後、問題はクラスにあることがわかりました。

コンストラクターInitializeはそのクラスのメソッドをRun呼び出し、同じクラスのメソッドもこのメソッドを呼び出しました。

Initializeメソッド内で、イベント リスナーが追加されたメイン ウィンドウのビュー モデルの「Initialize」メソッドへの呼び出しがありました。

[...]
AddWeakEventListener( m_MainWindowViewModel, MainWindowViewModelPropertyChanged );
[...]

Initializeクラスのコンストラクターからメソッドへの呼び出しを削除するとApplicationController、問題が解決しました。

于 2012-06-28T10:06:44.377 に答える
0

あなたのSomeObject.SelectedSomeItemセッターもレイズしますOnPropertyChanged( "SelectedSomeItem" );か?の種類はSomeObject何ですか? なぜプロパティSomeObjectも必要なのですか?SelectedSomeItem

をサブスクライブするコードも投稿してくださいMainWindowViewModelPropertyChanged

動作に問題はありませんでしたselecteditemが、公平を期すためINotifyPropertyChangedに、この情報を取得するために購読する必要はありませんでした. そして、あなたもそれを必要としなかったと思います。ビューモデル間で通信するためのより良い方法があります

編集:これは機能しますが、コード内の SomeObject が何であるかわかりません。

private WorkItemForUi _selected;
public WorkItemForUi SelectedSomeItem
{
get
{
    return this._selectedSomeItem;
}
set
{
    this._selectedSomeItem = value;
    OnPropertyChanged( "SelectedSomeItem" );
}
}
于 2012-06-22T09:56:10.463 に答える