从 IRepository 保存内容
Saving content from IRepository
我有一个自定义的 CloseTabAction,它允许我提出一个对话框。我的 BaseViewModel 实现了接口 'IRequestTabItemClose'.
public interface IRequestTabItemClose
{
void ConfirmCloseRequest(Action<bool, bool> callback);
void IsContentDirty(Action<bool> callBack);
}
因为它已经实现了,所以我可以使用方法'Implements'。
private static T Implements<T>(object content) where T : class
{
T implementor = content as T;
if (implementor != null) return implementor;
var element = content as FrameworkElement;
if (element != null) implementor = element.DataContext as T;
return implementor;
}
现在我可以覆盖 Invoke 方法。
internal class CloseTabAction : TriggerAction<Button>
{
protected override void Invoke(object parameter)
{
var args = parameter as RoutedEventArgs;
if (args == null) return;
var tabItem = FindParent<TabItem>(args.OriginalSource as DependencyObject);
if (tabItem == null) return;
tabItem.IsSelected = true;
var tabControl = FindParent<TabControl>(tabItem);
if (tabControl == null) return;
var region = RegionManager.GetObservableRegion(tabControl).Value;
if (region == null) return;
var content = Implementor<IRequestTabItemClose>(tabItem.Content);
if (content == null) return;
if (IsDirty(content))
{
RaiseConfirmDialog(content, region, tabItem);
}
else
{
region.Remove(tabItem.Content);
}
}
检查当前内容是否脏
private static bool IsDirty(IRequestTabItemClose content)
{
var isContentDirty = false;
content?.IsContentDirty(isDirty =>
{
if (isDirty)
isContentDirty = true;
});
return isContentDirty;
}
如果是,请提出对话框。
private static void RaiseConfirmDialog(IRequestTabItemClose content, IRegion region, TabItem tabItem)
{
content.ConfirmCloseRequest((canSave, cancel) =>
{
if (cancel) return;
if (canSave)
{
// Save Content Here.
region.Remove(tabItem.Content);
return;
}
region.Remove(tabItem.Content);
});
}
如果用户选择 'Yes' 那么它应该从注入到 ViewModel 的 IRepository 调用保存方法。调用此方法的最佳方式是什么,我应该使用事件聚合器还是其他一些实现?
您应该让 ViewModel 调用保存代码。所以你可以在你的界面中添加另一种方法来保存,或者当你的虚拟机显示对话框时,它会响应结果并相应地保存。自定义 TriggerAction 不需要调用 IRepository 东西。那属于虚拟机。
我有一个自定义的 CloseTabAction,它允许我提出一个对话框。我的 BaseViewModel 实现了接口 'IRequestTabItemClose'.
public interface IRequestTabItemClose
{
void ConfirmCloseRequest(Action<bool, bool> callback);
void IsContentDirty(Action<bool> callBack);
}
因为它已经实现了,所以我可以使用方法'Implements'。
private static T Implements<T>(object content) where T : class
{
T implementor = content as T;
if (implementor != null) return implementor;
var element = content as FrameworkElement;
if (element != null) implementor = element.DataContext as T;
return implementor;
}
现在我可以覆盖 Invoke 方法。
internal class CloseTabAction : TriggerAction<Button>
{
protected override void Invoke(object parameter)
{
var args = parameter as RoutedEventArgs;
if (args == null) return;
var tabItem = FindParent<TabItem>(args.OriginalSource as DependencyObject);
if (tabItem == null) return;
tabItem.IsSelected = true;
var tabControl = FindParent<TabControl>(tabItem);
if (tabControl == null) return;
var region = RegionManager.GetObservableRegion(tabControl).Value;
if (region == null) return;
var content = Implementor<IRequestTabItemClose>(tabItem.Content);
if (content == null) return;
if (IsDirty(content))
{
RaiseConfirmDialog(content, region, tabItem);
}
else
{
region.Remove(tabItem.Content);
}
}
检查当前内容是否脏
private static bool IsDirty(IRequestTabItemClose content)
{
var isContentDirty = false;
content?.IsContentDirty(isDirty =>
{
if (isDirty)
isContentDirty = true;
});
return isContentDirty;
}
如果是,请提出对话框。
private static void RaiseConfirmDialog(IRequestTabItemClose content, IRegion region, TabItem tabItem)
{
content.ConfirmCloseRequest((canSave, cancel) =>
{
if (cancel) return;
if (canSave)
{
// Save Content Here.
region.Remove(tabItem.Content);
return;
}
region.Remove(tabItem.Content);
});
}
如果用户选择 'Yes' 那么它应该从注入到 ViewModel 的 IRepository 调用保存方法。调用此方法的最佳方式是什么,我应该使用事件聚合器还是其他一些实现?
您应该让 ViewModel 调用保存代码。所以你可以在你的界面中添加另一种方法来保存,或者当你的虚拟机显示对话框时,它会响应结果并相应地保存。自定义 TriggerAction 不需要调用 IRepository 东西。那属于虚拟机。