c# - Caliburn.Micro Binding 似乎无法在 View 模型中解析

标签 c# wpf xaml binding caliburn.micro

我有一个名为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 ,因为触发了 ReportListItemViewModelOnViewAttached 方法。我知道 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/

相关文章:

c# - 将html字符串内容绑定(bind)到xaml中的Webview

c# - 具有 maxlength 属性的文本框的工具提示

c# - 在调整父级大小时调整子窗体控件的大小

c# - 通用存储库 - IRepository<T> 或 IRepository

c# - AssemblyTitle 一旦设置就永远不会改变,我希望它根据配置进行更改

vb.net - Windows 10通用应用程序VB.NET在页面之间传递数据

c# - 将计算出的 double 转换为十进制可以纠正精度误差吗?

c# - 解析 HTML 节点的正则表达式匹配失败

c# - 从 C# 调用 C++ 代码

c# - 如何右对齐 WPF ListItem 的某些元素?