使用Caliburn.Micro绑定深层属性的ComboBox

4

我的虚拟机有一个属于我的模型的属性Authorization,它有一个ActiveService的属性。

public Authorization Authorization
    {
        get
        {
            return this.authorization;
        }
        set
        {
            this.authorization = value;
            NotifyOfPropertyChange();
        }
    }

我在我的ViewModel上创建了一个额外的属性,称为Services,以填充下拉列表:
    public IList<Service> Services
    {
        get { return services; }
        set
        {
            services = value;
            NotifyOfPropertyChange();
        }
    }

我的视图有一个名为“Services”的combobox控件。我对Caliburn及其约定的理解是这应该可以工作。然而它无法正确显示我的项目。列表中的项目数量正确,但它只显示“找不到Models.Service的视图”。是否有任何帮助指出我做错了什么?
编辑:现在我尝试过手动设置DisplayMemberPath绑定,如下所示:
DisplayMemberPath="{Binding Authorization_ActiveService_Description}"

然后我添加了一个Override到我的Service对象的ToString()方法中,如下所示:

        public override string ToString()
    {
        return string.Format("{0}", this.Description);
    }

这个代码可以运行,现在下拉菜单中显示了我的描述。但我有点困惑。我能够删除_Description,它仍然可以正常工作。如果我去掉Override,它就完全不起作用。

为什么它不能对我的描述属性进行深度绑定?


无法找到 ViewModel 的视图,这与我的问题类似,但从未解决… - Refracted Paladin
嗯...我看不出为什么简单的 SelectedItem 绑定在这里不起作用,但也许我在图像中漏掉了什么。 - Patryk Ćwiek
@Trustme-I'maDoctor,您能详细说明一下您的意思吗?我对WPF、MVVM和Caliburn.Micro都很陌生,所以答案可能就在于我的无知。 - Refracted Paladin
1个回答

4

默认情况下,对于一个ItemsControl(例如ComboBox),如果没有设置ItemTemplate,那么Caliburn.Micro会将ItemTemplate设置为一个默认实现,该实现使用ContentControl进行视图注入,因为它假定您绑定集合中的每个项都是一个视图模型,并且您想要定义一个视图来绑定到该视图模型。

如果您不想定义一个视图,而是更愿意在ComboBox的标记中定义ItemTemplate,那么您可以这样做:

<ComboBox x:Name="Services">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBox Text="{Binding Name}" />
                <TextBox Text="{Binding AnotherServiceProperty}" />                  
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

啊,我的无知可能在这里起作用。并不是我不想定义一个视图,而是我不知道我需要定义一个。对WPF、MVVM、Caliburn以及整个框架都很陌生。在这种情况下,我该如何使用“默认”方式来创建组合框?我需要一个视图来显示下拉列表中的内容吗?它们之间是否有命名约定来联系在一起? - Refracted Paladin
对于一个简单的ComboBox来说,Caliburn.Micro的默认行为可能过于复杂,除非你想让每个项目都使用完整的视图。如果你只想要一个简单的显示字符串,你也可以设置DisplayMemberPath。至于约定,如果你有一个名为ItemViewModel的视图模型,它位于ViewModels文件夹中,那么CM将在兄弟Views文件夹中查找一个名为ItemView的视图。 - devdigital

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接