【发布时间】:2018-05-27 20:39:17
【问题描述】:
我有一个连接到我的视图模型的视图。每当用户从视图中更改所选项目时,我都会获取附加数据以附加到所选项目。如果我在更新所选项目后不提升属性本身,则结果不会在 UI 上更新。这显然不是预期的实现,但也许我不清楚该属性是如何得到通知的。
这是绑定到多个控件的支持属性。
public Break SelectedData
{
get { return _selectedData; }
set
{
if (_selectedData!= value && value != null)
{
_selectedData= value;
DeviceName = value.Feeder;
OnPropertyChanged("SelectedData");
}
}
}
这是将交互触发器绑定到视图模型中的异步命令的组合框:
<ComboBox ItemsSource="{Binding Feeders}" DisplayMemberPath="OMSName" SelectedItem="{Binding SelectedData, Mode=TwoWay}" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding SelectionChangedCommand}" CommandParameter="{Binding SelectedItem}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
在视图模型中,selectionchangedcommand 执行我的异步函数以在设置 selectionchangedcommand 时添加额外数据:
SelectionChangedCommand = new RelayAsyncCommand(UpdateSelectedData); --In the constructor of the viewmodel
public async void UpdateSelectedData()
{
try
{
await _breakRepo.GetEventData(SelectedData);
if (SelectedData.AttachedEvent.IsOpen)
{
SelectedData.Attributes= new EventAttributes
{
TotalAffected = SelectedData.AttachedEvent.Attributes.TotalAffected,
TotalRestored = SelectedData.AttachedEvent.Attributes.TotalRestored,
TotalOut = SelectedData.AttachedEvent.Attributes.TotalOut,
TotalCritical = SelectedData.AttachedEvent.Attributes.TotalCritical,
TotalMajor = SelectedData.AttachedEvent.Attributes.TotalMajor
};
await _breakRepo.CallEventsAsync(SelectedData);
}
else
{
await _breakRepo.GetBreakByFeederAsync(SelectedData);
}
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message);
}
finally
{
//IF I ADD ONPROPERTYCHANGED("SelectedData") the other fields that bind
//to the values will update as expected
CurrentlySearching = true;
}
}
【问题讨论】:
-
使用
UpdateSourceTrigger=Explicit -
你能在代码中指出你“提升属性本身”的行吗?
-
@GregN 您的 setter 没有被调用,因此不会引发事件。在你的命令中,你只改变
SelectedData你不会替换它。如果你让它像那样实现,那么是的,你需要自己触发事件来更新绑定。 -
@EdPlunkett 属性更改位于 finally 块中(刚刚将其注释掉)。
-
@JSteward 我可以手动触发 onchanged,但出于某种原因,我总是假设如果一个值在观察到的属性(突变)中发生变化,它自然会检测到它并提升该属性。
标签: c# wpf mvvm data-binding async-await