XAML 为什么我的PropertyChanged事件激发了两次?

vqlkdk9b  于 2022-12-07  发布在  其他
关注(0)|答案(3)|浏览(173)

我正在使用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被调用了两次,但是我不知道为什么,因为我没有设置这个值。任何帮助/指导都将是感激的。非常感谢。

whhtz7ly

whhtz7ly1#

我想我找到了我的问题。但是它给我带来了另一个问题。我在加载的时候两次调用添加PropertyChanged处理程序的方法。这是我必须解决的另一个问题。
谢谢你Lavr试图帮助我摆脱困境。

jaxagkaj

jaxagkaj2#

1.将断点放在AccountID setter中并查看堆栈跟踪,然后调用setter。您可以找到更新您的属性两次的“who”。
1.您也可以更新AccountID setter,如下所示:

private int _accountId;

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

of1yzvn43#

两次调用propertychanged也有同样的问题。当我试图捕捉额外的propertychanged调用时,调用堆栈显示它是从[外部代码]调用的。在我将Xamarin版本从4.0升级到最新版本(Xamarin 5.0)后。

相关问题