在 object 绑定 WPF 之前命令触发

Command fire before object bind WPF

我正在使用 Telerik 控件开发具有 MVVM 模式的 WPF 应用程序。

功能:

我使用的是 telerik:RadListBox,根据记录数在 运行 时间内生成。因此,如果我的 collection 中有 10 条记录,应用程序中将显示 10 RadListBox。当我 select 每个 RadListBox 时, SelectedItem 的详细视图(相关值)将显示在附近的面板中。一次只能 RadListBox 编辑 select。

场景:

所以在 selecting RadListBox 并编辑面板中的相关信息后,当我切换到另一个 RadListBox 时,将抛出一个警报(Yes/No) "Do you want to save the details?"。我已经在每个 object 中实现了 INPC,我会检查它是否已更改。

//XAML:

<telerik:RadListBox x:Name="lstSeries" BorderThickness="1" BorderBrush="#FFCBD8E8" ItemsSource="{Binding SCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, ValidatesOnDataErrors=True}" ItemTemplate="{StaticResource ImageDataTemplate}" DragEnter="lstMarketSeries_DragEnter" DragLeave="lstMarketSeries_DragLeave" Style="{StaticResource myListboxStyle}" SelectedItem="{Binding SelectedSeries, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" telerik:StyleManager.Theme="Windows8" PreviewKeyDown="RadListBox_PreviewKeyDown" MouseDoubleClick="lstMarketSeries_MouseDoubleClick" PreviewMouseDown="RadListBox_PreviewMouseLeftButtonDown" SelectionChanged="SeriesCommit_SelectionChanged">
</telerik:RadListBox>

//密钥object:

SelectedItem="{Binding SelectedSeries, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 

//视图模型:

/// <summary>
/// Get or set selected series.
/// </summary>
public SeriesBO SelectedSeries
  {
     get { return this.m_SelectedSeries; }
     set
         {
           if (this.m_SelectedSeries != value)
              {
                 this.m_SelectedSeries = value;
                 OnPropertyChanged();
              }
         }
   }

//Method called once a RadListBox is selected
    private void LoadSelectedMarketSeriesDetails()
        {
           if (!IsChanged())
              {
          //If there is no object edited then it should load the new selected object
              }
    }

private bool IsChanged()
{
    bool IsChanged = false;
    if (SeriesImageList != null)
          IsChanged = IsChanged || SeriesImageList.Where(x => x.IsChanged || x.IsNew).Count() > 0;

    if (NoteList != null)
          IsChanged = IsChanged || NoteList.Where(x => x.IsChanged || x.IsNew).Count() > 0 || IsChanged;

   if (IsChanged)
      {
          if (ShowMessages.SaveMessageBox())
             {
               //Hitting Yes in alert should save the values.
               //When retrieving the SelectedSeries object it shows the recent                     object selected but i need the last selected one.
             }
          else
            {
              //Discard function
            }
     }

     //After a successfull save or discard false is returned
    return false;
}

现在的问题是,在编辑系列之后和切换时抛出警报(Yes/No)。然后我点击保存,但第二个 object 被 selected 并绑定在 SelectedSeries object 中。当我尝试保存最后编辑的 object 时,我无法获得这些值。

我需要一些 CommandSelectedSeries object 绑定之前触发。这样我就可以检查 属性 是否已更改,并且我必须限制 object 绑定到第二个值 selected。一旦为先前的值完成保存,则 SelectedSeries 必须绑定到 object.

预期结果:

一旦第一个 selected 系列被编辑并切换到下一个,警报应该被抛出,作为警报的结果,系列应该被保存或丢弃,它应该移动到下一个系列,即 selected.

尝试做下一件事:

已编辑虚拟机

    /// <summary>
    /// Get or set selected series.
    /// </summary>
    public SeriesBO SelectedSeries
    {
        get { return this.m_SelectedSeries; }
        set
        {
            if (this.m_SelectedSeries != value)
            {
                m_PrevSelectedSeries = m_SelectedSeries;
                this.m_SelectedSeries = value;
                OnPropertyChanged();
            }
        }
    }

    //Method called once a RadListBox is selected
    private void LoadSelectedMarketSeriesDetails()
    {
        if (!IsChanged())
        {
            //If there is no object edited then it should load the new selected object
        }
    }

    private bool IsChanged()
    {
        bool IsChanged = false;
        if (SeriesImageList != null)
            IsChanged = IsChanged || SeriesImageList.Where(x => x.IsChanged || x.IsNew).Count() > 0;

        if (NoteList != null)
            IsChanged = IsChanged || NoteList.Where(x => x.IsChanged || x.IsNew).Count() > 0 || IsChanged;

        if (IsChanged)
        {
            if (ShowMessages.SaveMessageBox())
            {
                //Hitting Yes in alert should save the values.
                //When retrieving the SelectedSeries object it shows the recent object selected but i need the last selected one.
                Save(m_PrevSelectedSeries);
            }
            else
            {
                //Discard function
            }
        }

        //After a successfull save or discard false is returned
        return false;
    }

    private void Save(object mPrevSelectedSeries)
    {
        //perform the save logic
    }

我建议你保存之前的选择,当你需要保存的时候, 为上一个做。

此致,