2

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

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

不能在“Binding”类型的“Source”属性上设置“DynamicResourceExtension”。只能在 DependencyObject 的 DependencyProperty 上设置“DynamicResourceExtension”。

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

这是我的模型代码:

    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

我的视图模型:

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");
        }
    }

最后是我对组合框的看法的 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>

提前非常感谢大家。

编辑:

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

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

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

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

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

如果您仍在阅读本文,那么非常感谢您提供任何帮助。

4

1 回答 1

0

最后,我从来没有让组合框从另一个视图模型中填充。我仍然不确定这是否可能。

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

于 2015-02-06T14:14:16.307 回答