在 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 时,我无法获得这些值。
我需要一些 Command
在 SelectedSeries
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
}
我建议你保存之前的选择,当你需要保存的时候,
为上一个做。
此致,
我正在使用 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 时,我无法获得这些值。
我需要一些 Command
在 SelectedSeries
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
}
我建议你保存之前的选择,当你需要保存的时候, 为上一个做。
此致,