Ale*_*der 9 .net c# caliburn caliburn.micro winrt-xaml
我在WinRT应用程序中使用Caliburn.Micro
这是我的主要VM:
public class MainViewModel : Conductor<Screen>
{
protected override void OnActivate()
{
if (ActiveItem == null)
{
ActivateItem(
ViewModelLocator.LocateForViewType(typeof(NewsFeedView)) as Screen);
}
base.OnActivate();
}
}
Run Code Online (Sandbox Code Playgroud)
这里我使用指挥因为我想在ContentControl中加载不同的控件,但现在我只有这个代码.这是我在主视图中的内容控件:
<ContentControl x:Name="ActiveItem" Grid.Column="1" Grid.Row="1" />
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序时,一切正常,MainViewModel.Activate被调用并ActiveItem设置NewsFeedViewModel并ContentControl加载NewsFeedView.
问题:
当我在导航NewsFeedView控制,另一种观点认为使用NavigationService.NavigateToViewModel方法,然后在视图中使用NavigationService.GoBack,我就要回MainView在那一刻,当MainViewModel.Activate被称为ActiveItem没有null,但ContentControl.Content就是null.我已经尝试过使用View.Model附属物ContentControl但没有运气,如何让它重新绑定?
编辑: 最后我在Caliburn设置记录器,看看会发生什么,我发现一个错误 - 当导航后加载MainView这个事件发生时:
Attaching ***.Views.MainView to ***.ViewModels.MainViewModel.
ViewModel bound on ActiveItem.
Using cached view for ***.ViewModels.NewsFeedViewModel.
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Exception: Unspecified error
at Windows.UI.Xaml.Controls.ContentControl.put_Content(Object value)
... some winRT stack
at Caliburn.Micro.View.SetContentPropertyCore(...
Run Code Online (Sandbox Code Playgroud)
虽然它不是那么有用,我已经使用InteliTrace获取更多信息并得到了这样的信息:"元素已经是另一个元素的孩子了".我认为NewsFeedView存储在某个地方,当时间到了将它放入ContentControl这个异常时抛出.怎么解决这个?
您应该采用视图模型优先的方法。换句话说,激活视图模型的实例,Caliburn.Micro 将为您执行视图位置和绑定。
例如,您似乎只想在构造函数中实例化视图模型一次,或者OnInitialise:
public MainViewModel()
{
this.ActivateItem(new NewsFeedViewModel());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1303 次 |
| 最近记录: |