c# - 具有复合集合的组合框不会随着对 observablecollection 的更改而更新

标签 c# mvvm combobox observablecollection compositecollection

如标题所示;我有一个组合框,它使用复合集合绑定(bind)到使用 MVVM 模式的可观察集合。

如果我用现有数据加载我的模型,那么组合框会显示这些值,这样我就知道绑定(bind)有效了。我可以将项目添加到可观察集合中,它们显示在数据网格中,因此我知道可观察集合上的通知属性更改事件正在工作。我怀疑它不起作用,因为复合集合使用“静态资源”作为其来源,但如果我将其更改为动态资源,则会出现错误:

A 'DynamicResourceExtension' cannot be set on the 'Source' property of type 'Binding'. A 'DynamicResourceExtension' can only be set on a DependencyProperty of a DependencyObject.

我已经搜索了几天以找到解决方案,而其他人也遇到了类似的问题,但这些解决方案尚未解决我的问题。

这是我的模型代码:

    public class Model : ObservableObject
{
    #region Properties

    private string name;
    public string Name
    {
        get { return this.name; }
        set { this.name = value; }
    }

    private string balance;
    public string Balance
    {
        get { return this.balance; }
        set { this.balance = value; }
    }
    #endregion

我的 View 模型:

public class ViewModel : ObservableObject
{
    private ObservableCollection<Model> modelcollection;
    public ObservableCollection<Model> ModelCollection
    {
        get { return modelcollection; }
        set
        {
            modelcollection= value;
            RaisePropertyChangedEvent("ModelCollection");
        }
    }

    private string _name;
    public string Name 
    {
        get { return _name; } 
        set
        {
            _name = value;
            RaisePropertyChangedEvent("Name");
        }
    }
    private string _balance;
    public string Balance 
    {
        get { return _balance; } 
        set
        {
            _balance = value;
            RaisePropertyChangedEvent("Balance");
        }
    }

最后是组合框 View 的 XAML:

<ComboBox MinWidth="100" SelectedValue="{Binding combovalue, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="Name">
    <ComboBox.Resources>
        <vm:ViewModel x:Key="CollectionKey"/>
    </ComboBox.Resources>

    <ComboBox.ItemsSource>
        <CompositeCollection>
            <CollectionContainer Collection="{Binding ModelCollection, Source={StaticResource CollectionKey}, UpdateSourceTrigger=PropertyChanged}"/>
        </CompositeCollection>
    </ComboBox.ItemsSource>

    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=Name, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

在此先感谢大家。

编辑:

所以我已经朝着一个方向前进了;对错尚未定论。

我想我已经追踪到组合框本身之外的问题,因此这里需要更多上下文。

组合框位于选项卡控件的第二个选项卡上。每个选项卡项都有自己的数据上下文,指向自己的 View 模型。数据在第一个选项卡上输入,我希望该数据显示在第二个选项卡的组合框中。

如果我在第一个选项卡上放置一个组合框,那么该组合框会随着在第一个选项卡上输入的可观察集合的变化而更新。所以问题(我认为)是第二个选项卡上的组合框试图同时绑定(bind)到两个不同的 View 模型。一个用于项目源,另一个用于所选值。

在另一个线程中有人建议将 x:Reference 用于数据上下文,但我似乎无法找出正确的语法。

如果您仍在阅读本文,我们将不胜感激。

最佳答案

最后,我再也没有从其他 View 模型中填充组合框。我仍然不确定这是否可能。

最终对我有用的解决方案是将绑定(bind)所需的所有内容组合到一个 View 模型中。它使 View 模型有点沉重,但在 XAML 上减少了很多,所以我想这是一个胜利。

关于c# - 具有复合集合的组合框不会随着对 observablecollection 的更改而更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28311888/

相关文章:

c# - 用于将 WCF 服务发布到 Azure 的 web.config 更改

c# - Fluent NHibernate 中的内存泄漏

c# - 如何在 XAML 中创建 "Window"菜单?

c# - 在 MVVM 中的 Datagrid 内绑定(bind) WPF 组合框不保存更改

c# - 在 ViewModel 定位器中使用 SimpleIOC 注册 WCF 服务客户端时无法提供端点地址

python - PyQt:QDateComboBox setDate 使用字符串?

forms - 如何根据 MS Access 2007 中组合框中的值填充文本框的值?

c# - 从枚举填充 ComboBox

c# - 如何在 C# if 语句中使用 Discord 表情符号

c# - lambda在这里的最后一个函数有什么用?