1

基本的に、xaml で行ったことを C# に変換したいと考えています。これは、次の問題に関連しています: xaml の文字列をプロパティにバインドする

私の場合にプロキシが必要で使用される理由は次のとおりです 。 -遺伝性の/

CollectionContainer にバインドできるようにするプロキシ クラス:

public class BindingProxy : Freezable
{
    #region Overrides of Freezable

    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }

    #endregion

    public object Data
    {
        get { return (object)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Data.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}

コントロールのリソースで定義されたプロキシ:

<UserControl.Resources>
   <global:BindingProxy x:Key="proxy" Data="{Binding }" />
</UserControl.Resources>

最終的に C# に変換したい Xaml コード:

<ComboBox ItemsSource="{Binding NameCollection}">
   <ComboBox.ItemsSource>
      <CompositeCollection>
         <x:StaticExtension Member="VM:NameClass.NoName " />
         <CollectionContainer Collection="{Binding Data.NameCollection, Source={StaticResource proxy}}" />
      </CompositeCollection>
   </ComboBox.ItemsSource>
 </ComboBox>

View Model コレクションには入れたくないが、ユーザーに表示したい文字列定数:

public class NameClass
{
   public const string NoName = "[None]";
}
4

1 に答える 1

0

プロキシを含めようとして、複雑にしすぎたと思います。しかし、実際には非常に単純な解決策でした:

 ComboBox comboBox1 = new ComboBox { Height = 18, Width = 100, FontSize = 9.5 };

 CompositeCollection compositeCollection = new CompositeCollection();
 compositeCollection.Add(NameClass.NoName);

 CollectionContainer collectionContainer = new CollectionContainer();
 collectionContainer.Collection = ItemsSource1;

 compositeCollection.Add(collectionContainer);

 comboBox1.ItemsSource = compositeCollection;
于 2013-03-19T23:48:09.683 に答える