C# ListView不使用PropertyChanged事件更新
我正在使用 我有以下XMLC# 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"
<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
类中调整了我的属性以实现它,它现在可以工作了。谢谢