0

私は自分のプロパティを次のようにComboBoxDataContextのにバインドしようとしています。SelectedItem

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

ここで、ElementsリソースはCollectionViewSource(これが重要かどうかはわかりません)です。

すべてが初期化されると、のプロパティValueElementDataContextの最初の項目に設定されますCollectionViewSource。逆に初期化する必要が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>

単純に、フィルタリングに使用される追加のDependencyPropertyElementsForReferenceViewSourceから派生しCollectionViewSource、実装します。

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 に確実に含まれていることを確認してください。

私の場合、問題はオブジェクト ツリーを正しく逆シリアル化していなかったため、オブジェクトが 2 回インスタンス化されていました。次に、オブジェクトごとに個別の ViewModel が初期化され、明らかにプロパティの値がリストに含まれていませんでした。

述べる

これがあなたのケースの問題かどうかを確認するには、次のことを試してください。

ComboBox に表示される ViewModel の ToString() メソッドを次のようにオーバーライドします。

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

次に、ソース コレクション内のアイテムをプロパティの値と簡単に比較できます。最も専門的な方法ではありませんが、私にとってはうまくいきました。

于 2013-01-25T11:39:09.497 に答える