如何让caliburn.micro知道在cal时重新附加动作:Bind.Model指向新的对象实例?

时间:2014-01-21 23:46:33

标签: c# mvvm caliburn.micro

我有一个简单的用例,我在Caliburn.Micro中苦苦挣扎。我可以使用传统绑定轻松地使用它,但我想正确使用该框架。

简而言之,这是一个MDI风格的应用程序,它有一个顶级工具栏,我想将上下文绑定到Conductor.ActiveItem。基本上,我看到的问题是Calibun为第一个打开的选项卡设置了工具栏按钮的Actions,但是稍后当ActiveItem发生更改时,连接的操作将继续指向第一个分配的ActiveItem,而不是新的。 / p>

我的主ViewModel的类型为Conductor.Collection.OneActive。

public sealed class MainViewModel : Conductor<ITabPage>.Collection.OneActive
{
}

此视图模型包含一个简单的选项卡列表,每个选项卡都包含公共方法Save()和Undo()(以及CanSave和CanUndo的bool属性实现)。

public interface ITabPage : IScreen, IDisposable
{
    void Save();
    void Undo();
    bool CanSave { get; }
    bool CanUndo { get; }        
}

现在,视图包含顶级工具栏,其中按钮调用ActiveItem上的操作,TabControl显示导体项。

<Window xmlns:cal="http://www.caliburnproject.org" ...>
    <DockPanel>
        <ToolBar DockPanel.Dock="Top" cal:Bind.Model="{Binding ActiveItem}">
            <Button Name="Save">Save</Button>
            <Button Name="Undo">Undo</Button>
        </ToolBar>
        <TabControl x:Name="Items">
        </TabControl>
    </DockPanel>
</Window>

使用普通绑定和ICommands工作正常,但我不想在此框架上打架。有没有我错过或误用cal:Bind.Model?或者也许是一种让它知道刷新的方法?我也尝试在ActiveItem发生变化时调用Refresh()并且我绝对“确定CanSave和CanUndo正在正常通知(我设置了断点并且我已经成功使用了普通绑定。)

1 个答案:

答案 0 :(得分:2)

找到了一个解决方案:我误用了caliburn:Bind.Model。

正确的绑定类型是

caliburn:Bind.ModelWithoutContext="{Binding ... }"

使用该依赖项属性助手,可以在动作发生变化时将动作正确路由到ActiveItem。