我有一个名为Report
的数据传输对象。这些报告对象保存在另一个名为 Controller
的类中的可观察集合中。我想要做的是创建一个 View ,从 Report
中获取数据并将其显示在列表中。
我遇到的问题是我似乎无法将 View 正确绑定(bind)到 View 模型。我设法通过使用值转换器并返回我需要的 View 模型来绑定(bind)它,但即使附加了 View ,绑定(bind)似乎也无法解析。
包含 Report
列表的 View 模型:
public class ReportListViewModel : Screen, IModule
{
private Controller _controller;
public Controller Controller
{
get { return _controller; }
set { _controller = value; }
}
public ReportListViewModel(Controller controller)
{
Controller = controller;
Controller.Domain.Reports.Add(new Model.Report() { Notes = "Test Data.." });
}
}
以及它的 XAML View :
<Grid Background="Blue">
<StackPanel>
<StackPanel.Resources>
<local:ReportToListItem x:Key="reportToListItem" />
</StackPanel.Resources>
<ListBox Height="100" x:Name="Controller_Domain_Reports">
<ListBox.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding Converter={StaticResource reportToListItem}}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</Grid>
值转换器:
internal class ReportToListItem : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var vm = IoC.Get<ReportListItemViewModel>();
vm.Report = (Report)value;
var view = ViewLocator.GetOrCreateViewType(typeof(ReportListItemView));
ViewModelBinder.Bind(vm, view, null);
return view;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
下面是负责显示Report
对象数据的 View 模型和 View 。
View 模型:
public class ReportListItemViewModel : Screen
{
private Report _report;
public Report Report
{
get { return _report; }
set { _report = value; }
}
}
查看:
<Grid>
<TextBlock Text="{Binding Report, Path=Notes}" />
</Grid>
现在我知道正在附加 View ,因为触发了 ReportListItemViewModel
的 OnViewAttached
方法。我知道 View 也正在初始化,因为它的构造函数被触发。
但是 ReportListItemViewModel.Report
上的 getter 从未被调用。
那么绑定(bind)出了什么问题呢?
最佳答案
要使用 Caliburn 自动加载 View ,您必须绑定(bind)到 Caliburn 的附加属性:
<ContentControl cal:View.Model="{Binding ...}"/>
否则,您不会将相应的 View 加载到内容控件中,而是加载 View 模型本身。
编辑:
上面的内容似乎是无稽之谈,因为 OP 说 View 已创建,而且我认为我发现了实际问题:
如果你这样设置绑定(bind):
<TextBlock Text="{Binding Report, Path=Notes}" />
它不会工作,因为您正在用 Notes
覆盖路径 Report
。要访问 Report
中的 Notes
属性,您必须像这样指定项目:
<TextBlock Text="{Binding Report.Notes}" />
或者像这样:
<TextBlock Text="{Binding Path=Report.Notes}" />
关于c# - Caliburn.Micro Binding 似乎无法在 View 模型中解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8942260/