为什么我的PropertyChanged事件会触发两次?

时间:2015-04-20 18:45:26

标签: c# wpf entity-framework xaml mvvm-light

我正在使用wpf,mvvmlight和EF。我在我的实体对象上有两个松散链接的属性,在我的XAML中,我希望在另一个更改时有一个更改。现在,我遇到第一个属性更改事件触发两次的问题。

我的xaml设置是这样的,我在我的xaml上有DataGrid,我有我的

ItemsSource="{Binding MonthlyDonorDetails}" IsSynchronizedWithCurrentItem="True"

文本框就像,

<TextBox Grid.Column="0" Text="{Binding BankCustomerID}"/>

接下来,在我的虚拟机中,我加载了这样的数据,

int rowID = 1;
foreach(var row in monthlyDonorsQuery)
{
    row.RowID = rowID++;
    row.PropertyChanged += new PropertyChangedEventHandler(MonthlyDonorDataRow_PropertyChanged);
}

MonthlyDonorDetails = new ObservableCollection<MonthlyDonorFundCode>(monthlyDonorsQuery);

这为每行提供了一行行ID以帮助用户区分,并且(我在想)允许我为行中的各个字段更改时设置处理程序。然后我为网格设置了后台集合。这一切都很好。

现在,我希望能够将两个字段保持锁定状态,即AccountID和CustomerID。当用户手动\键入\输入更改AccountID字段时,我想要一些代码来更改CustomerID,但我不希望这种不必要的多次触发。现在它开了两次,我不知道为什么?谁能看到我的错误吗?

private void MonthlyDonorDataRow_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if(e.PropertyName == "FirstName" || e.PropertyName == "LastName")
        RaisePropertyChanged("DonorName");

    if(e.PropertyName == "AccountID")
    {
        MonthlyDonorFundCode monthlyDonation = sender as MonthlyDonorFundCode;
        int customerID = GetCimsIdFromBankCustomerID(monthlyDonation.AccountID);
        Debug.WriteLine("should be setting to " + customerID);
    }
}

当我调试这个时,我只能看到EF setter被调用两次,但我不知道为什么导致我没有设置该值。任何帮助\指导将不胜感激。非常感谢你。

2 个答案:

答案 0 :(得分:1)

我想我发现了我的问题。但它给我带来了另一个问题。我正在调用加载PropertyChanged处理程序的方法,两次加载。这是我必须解决的另一个问题。

谢谢Lavr试图帮助我。

答案 1 :(得分:0)

  1. 在AccountID setter中放置断点并查看堆栈跟踪然后调用setter。您可以找到“谁”更新您的房产两次。
  2. 您还可以像这样更新AccountID设置器:

    private int _accountId;
    
    public int AccountID
    {
        get { return this._accountId; }
        set 
        {
            if (this._accountId == value) return;
            this._accountId = value;
            this.RisePropertyChanged("AccountID");
        }
    }