我有一个简单的用例,我在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正在正常通知(我设置了断点并且我已经成功使用了普通绑定。)
答案 0 :(得分:2)
找到了一个解决方案:我误用了caliburn:Bind.Model。
正确的绑定类型是
caliburn:Bind.ModelWithoutContext="{Binding ... }"
使用该依赖项属性助手,可以在动作发生变化时将动作正确路由到ActiveItem。