【问题标题】:WPF DataBinding Requires Manual RaiseWPF 数据绑定需要手动提升
【发布时间】: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


【解决方案1】:

由于您没有重新分配SelectedData,因此控件将永远不会知道任何更改。

这就是为什么您必须自己手动引发事件

如果你绑定到某个地方,例如。 SelectedData.Attributes 那么你可能没有在SelectedData 上正确实现INotifyPropertyChanged

【讨论】:

  • 看来我的模型 (SelectedData) 没有在我的 notifypropertychanged 的​​情况下一直向下隧道,因此它没有通知备份。正确实现了模型,现在无需手动提升属性即可工作。
猜你喜欢
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
相关资源
最近更新 更多