C# ListView不使用PropertyChanged事件更新

C# ListView不使用PropertyChanged事件更新,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我正在使用 我有以下XML <TextBox Text="{Binding SelectedLimitAmount, UpdateSourceTrigger=PropertyChanged, StringFormat={}{0:$#,#.00}}" Grid.Column="1" Grid.Row="0" Height="20" Margin="2,2,2,2"/> <Button Content="Adjust" FontSize="9"

我正在使用

我有以下XML

<TextBox Text="{Binding SelectedLimitAmount, UpdateSourceTrigger=PropertyChanged, StringFormat={}{0:$#,#.00}}"
        Grid.Column="1" Grid.Row="0" Height="20" Margin="2,2,2,2"/>
<Button Content="Adjust" 
        FontSize="9"
        Command="{Binding AdjustLimit}"
        Background="Blue" Foreground="White"
        Grid.Column="1" Grid.Row="1" 
        Height="20" Width="75" HorizontalAlignment="Right" Margin="2,2,2,2"/>
<!--Credit Limit Listview-->
<ListView ItemsSource="{Binding Limits, UpdateSourceTrigger=PropertyChanged}" 
          SelectedItem="{Binding SelectedLimit}"
          SelectionMode="Single"
          Grid.ColumnSpan="2" Grid.Row="2" Margin="2,2,2,0">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Account" DisplayMemberBinding="{Binding Activity}"/>
            <GridViewColumn Header="Credit Limit" DisplayMemberBinding="{Binding LimitAmount, StringFormat={}{0:$#,#.00}}"/>
        </GridView>
    </ListView.View>
</ListView>

绑定到此代码的:

Public Class ImportPresenter : ObservableObject
{
    //Credit Limits
    private ObservableCollection<CreditLimitItem> _Limits;
    private CreditLimitItem _SelectedLimit;
    private decimal _SelectedLimitAmount = 0;

    public ObservableCollection<CreditLimitItem> Limits
    {
        get
        {
            return _Limits;
        }
        set
        {
            _Limits = value;
            Debug.Print("Limits Updated");
            RaisePropertyChangedEvent("Limits");
        }
    }

    public decimal SelectedLimitAmount
    {
        get { return _SelectedLimitAmount; }
        set
        {
            _SelectedLimitAmount = value;
            Debug.Print("Amount Changed");
            RaisePropertyChangedEvent("SelectedLimitAmount");
        }
    }

    /// <summary>
    /// Selected Credit Limit
    /// </summary>
    public CreditLimitItem SelectedLimit
    {
        get
        {
            return _SelectedLimit;
        }
        set
        {
            _SelectedLimit = value;
            SelectedLimitAmount = _SelectedLimit.LimitAmount;
            RaisePropertyChangedEvent("SelectedLimit");
        }
    }

    public ICommand AdjustLimit
    {
        get { return new DelegateCommand(UpdateLimit); }
    }

    private void UpdateLimit()
    {
        if(_SelectedLimit != null)
        {
            _SelectedLimit.LimitAmount = _SelectedLimitAmount;
            RaisePropertyChangedEvent("Limits");

            foreach(CreditLimitItem item in Limits)
            {
                Debug.Print(item.LimitAmount.ToString());
            }
        }
    }
}

public class CreditLimitItem
{

    private int _LimitSequence;
    private short _ActivitySequence;
    private string _Activity;
    private decimal _LimitAmount;
    private DateTime _StartDate;
    private DateTime _EndDate;
    private decimal _NewLimit;

    public int LimitSequence { get => _LimitSequence; set => _LimitSequence = value; }
    public short ActivitySequence { get => _ActivitySequence; set => _ActivitySequence = value; }
    public string Activity { get => _Activity; set => _Activity = value; }
    public decimal LimitAmount { get => _LimitAmount; set => _LimitAmount = value; }
    public DateTime StartDate { get => _StartDate; set => _StartDate = value; }
    public DateTime EndDate { get => _EndDate; set => _EndDate = value; }
    public decimal NewLimit { get => _NewLimit; set => _NewLimit = value; }
    public decimal LimitChange { get => _LimitAmount - _NewLimit; }


    public CreditLimitItem(int sequence, short activitySequence, string activity, decimal amount, DateTime startDate, DateTime endDate)
    {
        _LimitSequence = sequence;
        _ActivitySequence = activitySequence;
        _Activity = activity;
        _LimitAmount = amount;
        _StartDate = startDate;
        _EndDate = endDate;
    }
}
公共类ImportPresenter:ObservableObject
{
//信贷限额
私人可观测收集限额;
private CreditLimitItem _SelectedLimit;
私有十进制_SelectedLimitAmount=0;
公共可观测收集限值
{
收到
{
返回限制;
}
设置
{
_极限=值;
调试。打印(“限额更新”);
提高产权变更(“限额”);
}
}
公共十进制选择限制金额
{
获取{return\u SelectedLimitAmount;}
设置
{
_SelectedLimitAmount=值;
调试。打印(“变更金额”);
RaisePropertyChangedEvent(“SelectedLimitAmount”);
}
}
/// 
///选定信贷限额
/// 
公共信贷限额项目已选择限额
{
收到
{
返回_SelectedLimit;
}
设置
{
_SelectedLimit=值;
SelectedLimitAmount=\u SelectedLimit.LimitAmount;
提高财产变更限额(“选定限额”);
}
}
公共ICommand限制
{
获取{returnnewdelegatecommand(UpdateLimit);}
}
私有void UpdateLimit()
{
如果(_SelectedLimit!=null)
{
_SelectedLimit.LimitAmount=\u SelectedLimitAmount;
提高产权变更(“限额”);
foreach(限额中的CreditLimitItem项目)
{
Debug.Print(item.LimitAmount.ToString());
}
}
}
}
公共类项目
{
私有整数序列;
私有短活动序列;
私有字符串_活动;
私人十进制_LimitAmount;
私人日期时间(StartDate);;
私有日期时间_EndDate;
私有十进制_NewLimit;
public int LimitSequence{get=>\u LimitSequence;set=>\u LimitSequence=value;}
公共短ActivitySequence{get=>\u ActivitySequence;set=>\u ActivitySequence=value;}
公共字符串活动{get=>\u Activity;set=>\u Activity=value;}
公共十进制限制金额{get=>\u LimitAmount;set=>\u LimitAmount=value;}
public DateTime StartDate{get=>\u StartDate;set=>\u StartDate=value;}
public DateTime EndDate{get=>\u EndDate;set=>\u EndDate=value;}
公共十进制NewLimit{get=>\u NewLimit;set=>\u NewLimit=value;}
public decimal LimitChange{get=>\u LimitAmount-\u NewLimit;}
public CreditLimitItem(整数序列、短活动序列、字符串活动、十进制金额、DateTime开始日期、DateTime结束日期)
{
_LimitSequence=序列;
_ActivitySequence=ActivitySequence;
_活动=活动;
_LimitAmount=金额;
_开始日期=开始日期;
_EndDate=EndDate;
}
}

但是,当我更新
文本框
控件时,
列表视图
不会在
属性更改
事件上刷新。我的XAML中是否遗漏了什么?我应该能够在我的
文本框
中调整所选的
CreditLimitItem.LimitAmount
,相关的
列表视图
应该在我点击
调整
后更新。但是,不确定它为什么不起作用。

您的类CreditLimitItem应该为此实现INotifyPropertyChanged。
当您调用
\u SelectedLimit.LimitAmount=\u SelectedLimitAmount由于LimitAmount setter未引发PropertyChanged事件,因此未发生任何事件。请注意,
RaisePropertyChangedEvent(“限制”)完全无效,因为限制仍然是同一个集合。

CreditLimitItem
需要是一个
ObservableObject
,并且需要在绑定值上引发属性更改。请注意,在ItemsSource绑定上设置
UpdateSourceTrigger=PropertyChanged
是没有意义的。它在此处无效,与INotifyPropertyChanged接口的PropertyChanged事件无关。您必须为
CreditLimitItem.LimitAmout
属性触发PropertyChanged事件。这不是自动发生的。只有当它应该通知值的变化时:-)轻微的批评,ObservableCollections应该是只读属性。它们具有UI使用的更改通知。这就是为什么它们是“可观察的”。谢谢!我假设在
Limits
属性中触发
PropertyChanged
事件会改变集合。我已经在我的
CreditLimitItem
类中调整了我的属性以实现它,它现在可以工作了。谢谢