0

我正在尝试将 my 的属性绑定DataContextSelectedItemComboBox 上,如下所示:

<ComboBox x:Name="ElementSelector" 
          ItemsSource="{Binding Source={StaticResource Elements}}"
          DisplayMemberPath="ElementName"
          SelectedItem="{Binding ValueElement, Mode=TwoWay}">

Elements资源在哪里CollectionViewSource(不知道这是否重要)。

初始化所有内容后, 的属性ValueElement设置DataContextCollectionViewSource. SelectedItem我想要的是以相反的方式对其进行初始化:如果不包含匹配项,我想将 ComboBox 设置为属性的值或 null 。

如何才能做到这一点?

编辑 - 附加信息:

ComboBox 是 DataTemplate 的一部分:

<DataTemplate x:Key="ReferenceTemplate" 
              DataType="viewModels:ElementMetaReferenceViewModel">
   <StackPanel Orientation="Horizontal">
      <StackPanel.Resources>
         <ResourceDictionary>
            <views:ElementsForReferenceViewSource x:Key="Elements" 
                                                  Source="{Binding  DataContext.CurrentProject.Elements, ElementName=Root}" 
                                                  ReferenceToFilterFor="{Binding}"/>
         </ResourceDictionary>
      </StackPanel.Resources>

      <TextBlock Text="{Binding PropertyName}"/>
      <ComboBox x:Name="ElementSelector" 
                ItemsSource="{Binding Source={StaticResource Elements}}"
                DisplayMemberPath="ElementName" 
                SelectedItem=""{Binding ValueElement, Mode=TwoWay}" />

   </StackPanel>
</DataTemplate>

ElementsForReferenceViewSource简单地派生CollectionViewSource并实现了用于过滤的附加 DependencyProperty 。

中的DataContext项目CollectionViewSource如下所示:

public class ElementMetaReferenceViewModel : ViewModelBase<ElementMetaReference, ElementMetaReferenceContext>
{
   ...
    private ElementMetaViewModel _valueElement;

    public ElementMetaViewModel ValueElement
    {
        get { return _valueElement; }
        set
        {
            if (value == null) return;
            _valueElement = value;
            Model.TargetElement = value.Model;
        }
    }

    ...
}
4

1 回答 1

0

对于遇到相同问题的人

上面的代码按预期工作。解决方案是让幕后的东西正确。确保 ViewModel 的实例(即您要绑定到的属性的值)肯定包含在 CollectionViewSource 中。

就我而言,问题是错误地反序列化对象树,因此对象被实例化了两次。然后为每个对象初始化一个不同的 ViewModel,然后显然该属性的值不包含在列表中。

评论

要检查这是否是您的问题,您可以尝试以下操作:

覆盖 ComboBox 中显示的 ViewModel 的 ToString() 方法,如下所示:

public override string ToString()
{
   return "VM"+ Model.GetHashCode().ToString();
}

然后,您可以轻松地将源集合中的项目与您的属性值进行比较。不是最专业的方式,但它为我完成了工作。

于 2013-01-25T11:39:09.497 回答