【问题标题】:Saving content from IRepository从 IRepository 保存内容
【发布时间】:2015-12-07 02:43:40
【问题描述】:

我有一个自定义的 CloseTabAction,它允许我提出一个对话框。我的 BaseViewModel 实现了接口“IRequestTabItemClose”。

public interface IRequestTabItemClose
{
    void ConfirmCloseRequest(Action<bool, bool> callback);

    void IsContentDirty(Action<bool> callBack);
} 

因为它已经实现,所以我可以使用“实现”方法。

    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);
        });
    }

如果用户选择“是”,那么它应该从注入 ViewModel 的 IRepository 调用保存方法。调用此方法的最佳方式是什么,我应该使用事件聚合器还是其他一些实现?

【问题讨论】:

    标签: c# mvvm unity-container prism


    【解决方案1】:

    您应该让 ViewModel 调用保存代码。因此,您可以在界面中添加另一种方法进行保存,或者当您的 VM 显示对话框时,它会响应结果并相应地保存。自定义 TriggerAction 不需要调用 IRepository 的东西。这属于虚拟机。

    【讨论】:

    • 谢谢,我不知道从哪里调用 IRepository 方法,因为它是从 VM 调用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多