C# 更新属性和乒乓球事件

C# 更新属性和乒乓球事件,c#,wpf,mvvm,catel,C#,Wpf,Mvvm,Catel,在使用Catel for MVVM框架的WPF应用程序中,我在viewmodel中有3个不同的属性 public double? QtaDiv1 { get; set; } public double? Exchange{ get; set; } public double? QtaDiv2 { get; set; } 我已将OnProperty更改为 protected async override void OnPropertyChanged(AdvancedP

在使用Catel for MVVM框架的WPF应用程序中,我在viewmodel中有3个不同的属性

    public double? QtaDiv1 { get; set; }

    public double? Exchange{ get; set; }

    public double? QtaDiv2 { get; set; }
我已将OnProperty更改为

protected async override void OnPropertyChanged(AdvancedPropertyChangedEventArgs e)
    {
        if (e.PropertyName == "Data")
        {
            await GetValueDate(e);
        }
        else if (e.PropertyName == "QtaDiv1" || e.PropertyName == "Exchange")
        {
            ChangeQtaDiv2(QtaDiv1, Exchange);
        }
        if (e.PropertyName == "QtaDiv2")
        {
            ChangeQtaDiv1(QtaDiv2, Exchange);
        }
        else if (e.PropertyName == "SelectedCross")
        {
            await GetValueDate(e);
            CheckForSplitVisibility();
        }

        base.OnPropertyChanged(e);
    }
我要做的是,如果QtaDiv1和exchange有值,我计算QtaDiv2 否则,如果用户(和Exchange)更改了QtaDiv2,我将更新QtaDiv1

在我更新QtaDiv2之前,这一切都很好,因为在这一点上,我在QtaDiv1上得到了一个属性更改,它调用了QtaDiv2上的更新,以此类推

我怎样才能打破这个咒语???我想设置一个字符串字段来保存更改的值,但是如果我这样做,我必须抑制RaisePropertyChanged通知(并且我必须转换为backing field属性),这样我就不会对它们进行验证


谢谢

您只需要添加一个简单的
bool
变量来表示更改是否来自代码内部:

private bool isInternalChange = false;
如果是内部更改,则可以忽略它:

if (!isInternalChange)
{
    if (e.PropertyName == "Data")
    {
        await GetValueDate(e);
    }
    else if (e.PropertyName == "QtaDiv1" || e.PropertyName == "Exchange")
    {
        isInternalChange = true;
        ChangeQtaDiv2(QtaDiv1, Exchange);
        isInternalChange = false;
    }
    if (e.PropertyName == "QtaDiv2")
    {
        isInternalChange = true;
        ChangeQtaDiv1(QtaDiv2, Exchange);
        isInternalChange = false;
    }
    else if (e.PropertyName == "SelectedCross")
    {
        await GetValueDate(e);
        CheckForSplitVisibility();
    }

    base.OnPropertyChanged(e);
}

您只需添加一个简单的
bool
变量来表示更改是否来自代码内部:

private bool isInternalChange = false;
如果是内部更改,则可以忽略它:

if (!isInternalChange)
{
    if (e.PropertyName == "Data")
    {
        await GetValueDate(e);
    }
    else if (e.PropertyName == "QtaDiv1" || e.PropertyName == "Exchange")
    {
        isInternalChange = true;
        ChangeQtaDiv2(QtaDiv1, Exchange);
        isInternalChange = false;
    }
    if (e.PropertyName == "QtaDiv2")
    {
        isInternalChange = true;
        ChangeQtaDiv1(QtaDiv2, Exchange);
        isInternalChange = false;
    }
    else if (e.PropertyName == "SelectedCross")
    {
        await GetValueDate(e);
        CheckForSplitVisibility();
    }

    base.OnPropertyChanged(e);
}

您只需添加一个简单的
bool
变量来表示更改是否来自代码内部:

private bool isInternalChange = false;
如果是内部更改,则可以忽略它:

if (!isInternalChange)
{
    if (e.PropertyName == "Data")
    {
        await GetValueDate(e);
    }
    else if (e.PropertyName == "QtaDiv1" || e.PropertyName == "Exchange")
    {
        isInternalChange = true;
        ChangeQtaDiv2(QtaDiv1, Exchange);
        isInternalChange = false;
    }
    if (e.PropertyName == "QtaDiv2")
    {
        isInternalChange = true;
        ChangeQtaDiv1(QtaDiv2, Exchange);
        isInternalChange = false;
    }
    else if (e.PropertyName == "SelectedCross")
    {
        await GetValueDate(e);
        CheckForSplitVisibility();
    }

    base.OnPropertyChanged(e);
}

您只需添加一个简单的
bool
变量来表示更改是否来自代码内部:

private bool isInternalChange = false;
如果是内部更改,则可以忽略它:

if (!isInternalChange)
{
    if (e.PropertyName == "Data")
    {
        await GetValueDate(e);
    }
    else if (e.PropertyName == "QtaDiv1" || e.PropertyName == "Exchange")
    {
        isInternalChange = true;
        ChangeQtaDiv2(QtaDiv1, Exchange);
        isInternalChange = false;
    }
    if (e.PropertyName == "QtaDiv2")
    {
        isInternalChange = true;
        ChangeQtaDiv1(QtaDiv2, Exchange);
        isInternalChange = false;
    }
    else if (e.PropertyName == "SelectedCross")
    {
        await GetValueDate(e);
        CheckForSplitVisibility();
    }

    base.OnPropertyChanged(e);
}

@Sheridan的答案是正确的。正如@Boris B.所指出的,最好尝试一下……最后。使用Catel时,您可以这样做:

if (!_isInternalChange)
{
    if (e.HasPropertyChanged(() => Data))
    {
        await GetValueDate(e);
    }
    else if (e.HasPropertyChanged(() => QtaDiv1) || e.HasPropertyChanged(() => Exchange))
    {
        using (StartInternalChange())
        {
            ChangeQtaDiv2(QtaDiv1, Exchange);
        }
    }
    if (e.HasPropertyChanged(() => QtaDiv2))
    {
        using (StartInternalChange())
        {   
            ChangeQtaDiv1(QtaDiv2, Exchange);
        }
    }
    else if (e.HasPropertyChanged(() => SelectedCross))
    {
        await GetValueDate(e);
        CheckForSplitVisibility();
    }

    base.OnPropertyChanged(e);
}

private IDisposable StartInternalChange()
{
    return new DisposableToken<MyClass>(this, 
        x => x._isInternalUpdate = false,
        x => x._isInternalUpdate = true);
}
if(!\u isInternalChange)
{
如果(例如HasPropertyChanged(()=>数据))
{
等待GetValueDate(e);
}
如果(e.HasPropertyChanged(()=>QtaDiv1)| e.HasPropertyChanged(()=>Exchange))
{
使用(StartInternalChange())
{
变更qtadiv2(QtaDiv1,交换);
}
}
如果(如HasPropertyChanged(()=>QtaDiv2))
{
使用(StartInternalChange())
{   
变更QTADIV1(QtaDiv2,交换);
}
}
否则,如果(例如,已更改属性(()=>SelectedCross))
{
等待GetValueDate(e);
CheckForSplitVisibility();
}
根据改变的财产(e);
}
私有IDisposable StartInternalChange()
{
返回新的可处置令牌(此,
x=>x.\u isInternalUpdate=false,
x=>x._isInternalUpdate=true);
}

由@Sheridan给出的答案是正确的。正如@Boris B.所指出的,最好尝试一下……最后。使用Catel时,您可以这样做:

if (!_isInternalChange)
{
    if (e.HasPropertyChanged(() => Data))
    {
        await GetValueDate(e);
    }
    else if (e.HasPropertyChanged(() => QtaDiv1) || e.HasPropertyChanged(() => Exchange))
    {
        using (StartInternalChange())
        {
            ChangeQtaDiv2(QtaDiv1, Exchange);
        }
    }
    if (e.HasPropertyChanged(() => QtaDiv2))
    {
        using (StartInternalChange())
        {   
            ChangeQtaDiv1(QtaDiv2, Exchange);
        }
    }
    else if (e.HasPropertyChanged(() => SelectedCross))
    {
        await GetValueDate(e);
        CheckForSplitVisibility();
    }

    base.OnPropertyChanged(e);
}

private IDisposable StartInternalChange()
{
    return new DisposableToken<MyClass>(this, 
        x => x._isInternalUpdate = false,
        x => x._isInternalUpdate = true);
}
if(!\u isInternalChange)
{
如果(例如HasPropertyChanged(()=>数据))
{
等待GetValueDate(e);
}
如果(e.HasPropertyChanged(()=>QtaDiv1)| e.HasPropertyChanged(()=>Exchange))
{
使用(StartInternalChange())
{
变更qtadiv2(QtaDiv1,交换);
}
}
如果(如HasPropertyChanged(()=>QtaDiv2))
{
使用(StartInternalChange())
{   
变更QTADIV1(QtaDiv2,交换);
}
}
否则,如果(例如,已更改属性(()=>SelectedCross))
{
等待GetValueDate(e);
CheckForSplitVisibility();
}
根据改变的财产(e);
}
私有IDisposable StartInternalChange()
{
返回新的可处置令牌(此,
x=>x.\u isInternalUpdate=false,
x=>x._isInternalUpdate=true);
}

由@Sheridan给出的答案是正确的。正如@Boris B.所指出的,最好尝试一下……最后。使用Catel时,您可以这样做:

if (!_isInternalChange)
{
    if (e.HasPropertyChanged(() => Data))
    {
        await GetValueDate(e);
    }
    else if (e.HasPropertyChanged(() => QtaDiv1) || e.HasPropertyChanged(() => Exchange))
    {
        using (StartInternalChange())
        {
            ChangeQtaDiv2(QtaDiv1, Exchange);
        }
    }
    if (e.HasPropertyChanged(() => QtaDiv2))
    {
        using (StartInternalChange())
        {   
            ChangeQtaDiv1(QtaDiv2, Exchange);
        }
    }
    else if (e.HasPropertyChanged(() => SelectedCross))
    {
        await GetValueDate(e);
        CheckForSplitVisibility();
    }

    base.OnPropertyChanged(e);
}

private IDisposable StartInternalChange()
{
    return new DisposableToken<MyClass>(this, 
        x => x._isInternalUpdate = false,
        x => x._isInternalUpdate = true);
}
if(!\u isInternalChange)
{
如果(例如HasPropertyChanged(()=>数据))
{
等待GetValueDate(e);
}
如果(e.HasPropertyChanged(()=>QtaDiv1)| e.HasPropertyChanged(()=>Exchange))
{
使用(StartInternalChange())
{
变更qtadiv2(QtaDiv1,交换);
}
}
如果(如HasPropertyChanged(()=>QtaDiv2))
{
使用(StartInternalChange())
{   
变更QTADIV1(QtaDiv2,交换);
}
}
否则,如果(例如,已更改属性(()=>SelectedCross))
{
等待GetValueDate(e);
CheckForSplitVisibility();
}
根据改变的财产(e);
}
私有IDisposable StartInternalChange()
{
返回新的可处置令牌(此,
x=>x.\u isInternalUpdate=false,
x=>x._isInternalUpdate=true);
}

由@Sheridan给出的答案是正确的。正如@Boris B.所指出的,最好尝试一下……最后。使用Catel时,您可以这样做:

if (!_isInternalChange)
{
    if (e.HasPropertyChanged(() => Data))
    {
        await GetValueDate(e);
    }
    else if (e.HasPropertyChanged(() => QtaDiv1) || e.HasPropertyChanged(() => Exchange))
    {
        using (StartInternalChange())
        {
            ChangeQtaDiv2(QtaDiv1, Exchange);
        }
    }
    if (e.HasPropertyChanged(() => QtaDiv2))
    {
        using (StartInternalChange())
        {   
            ChangeQtaDiv1(QtaDiv2, Exchange);
        }
    }
    else if (e.HasPropertyChanged(() => SelectedCross))
    {
        await GetValueDate(e);
        CheckForSplitVisibility();
    }

    base.OnPropertyChanged(e);
}

private IDisposable StartInternalChange()
{
    return new DisposableToken<MyClass>(this, 
        x => x._isInternalUpdate = false,
        x => x._isInternalUpdate = true);
}
if(!\u isInternalChange)
{
如果(例如HasPropertyChanged(()=>数据))
{
等待GetValueDate(e);
}
如果(e.HasPropertyChanged(()=>QtaDiv1)| e.HasPropertyChanged(()=>Exchange))
{
使用(StartInternalChange())
{
变更qtadiv2(QtaDiv1,交换);
}
}
如果(如HasPropertyChanged(()=>QtaDiv2))
{
使用(StartInternalChange())
{   
变更QTADIV1(QtaDiv2,交换);
}
}
否则,如果(例如,已更改属性(()=>SelectedCross))
{
等待GetValueDate(e);
CheckForSplitVisibility();
}
根据改变的财产(e);
}
私有IDisposable StartInternalChange()
{
返回新的可处置令牌(此,
x=>x.\u isInternalUpdate=false,
x=>x._isInternalUpdate=true);
}

公共构造是一个
try..finally
,在
ChangeQtaDiv
抛出的情况下。公共构造是一个
try..finally
,在
ChangeQtaDiv
抛出的情况下。公共构造是一个
try..finally
抛出的情况下。公共构造是一个
try..finally
,在代码< > ChangeQtaDiv < /COD>投掷。提示:考虑使用if(E.HasPrimTyType(())=数据)。它比字符串比较慢一点,但将在编译时检查。提示:考虑使用if(E.HasPR)。