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 方法被调用了两次,而不是一次

可能是这种情况下,该SelectedItem属性被设置为发生两次,但我不太确定,因为我发现的很多信息有点矛盾(有时也不太清楚 Windows 窗体或 WPF 是的意思)。

我已经看到一些建议,其中为 定义了 SelectionChanged 事件处理程序DataGrid并使用了一个IsSelected属性,但据我所知,由于我的数据绑定,这不应该是必需的。

更新 作为 MainWindowController 的一部分,有一个 Initialize 方法引用 MainWindowViewModelPropertyChanged 处理程序。

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

任何想法可能是我的问题的原因是什么?

4

2 回答 2

0

你的SomeObject.SelectedSomeItem二传手也加注OnPropertyChanged( "SelectedSomeItem" );吗?是什么类型的SomeObject?为什么SomeObject还需要SelectedSomeItemProperty?

还请在您订阅的地方发布一些代码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 回答
0

好吧,在这上面花了一些时间后,我们发现问题出在ApplicationController课堂上。

构造函数调用了Initialize那个类中的Run方法,同一个类中的方法也调用了这个方法。

在该Initialize方法中调用了主窗口的视图模型“Initialize”方法,其中添加了一个事件监听器:

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

Initialize从类的构造函数中删除对方法的调用ApplicationController解决了这个问题。

于 2012-06-28T10:06:44.377 回答