2016-09-29 13 views
0

私は、項目のリストを持つComboBoxを持つUserControlを作成しようとしています。次に、何らかのアクションを実行するボタンを追加したいと思います。ボタンでUserControl ComboBoxを作成する

私はこのコードを持っている:

ComboBoxWithButton XAML:

<ComboBox x:Name="ComboBoxBtn" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="0,0,0,-1" Width="100" ItemsSource="{Binding Source}"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto" /> 
         <ColumnDefinition Width="Auto" /> 
        </Grid.ColumnDefinitions> 
        <Label Content="{Binding }" Width="100" /> 
        <Button Grid.Column="1">Something</Button> 
       </Grid> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 

ComboBoxWithButtonコード:

public ComboBoxWithButton() 
     { 
      InitializeComponent(); 
     } 


     public static readonly DependencyProperty SourceProprety = 
      DependencyProperty.Register("Source", typeof(ObservableCollection<object>), typeof(ComboBoxWithButton), new PropertyMetadata(null)); 

     public ObservableCollection<object> Source 
     { 
      get { return (ObservableCollection<object>)GetValue(ValueProprety); } 
      set { SetValue(ValueProprety, value); } 
     } 

その後、私のウィンドウ上の私が呼ぶ:

<controls:ComboBoxWithButton Source="{Binding SomeCollection}"/> 

しかし、コンボボックスをはempですTY

+0

"私はリスティングを取得していません"あなたはコンボボックスが空であると言っていますか?あなたのusercontrol XAMLのコンボボックスに 'ItemsSource =" {Binding Source、RelativeSource = {RelativeSource AncestorType = UserControl}} "をバインドしてみてください。 BTW 'Source'は' ObservableCollection'である必要はありません。消費者があなたに与えていることの中でできるだけ広い範囲を可能にするために非ジェネリックな 'IEnumerable'にしましょう。 'ComboBox.ItemsSource'は' IEnumerable'です。コンボボックスは物事を把握します。 –

+0

はい、それは私が意味するものでした。あなたの言ったことを変えることはまだ同じです –

+0

ちなみに、 'Source'プロパティを修正してみてください。 'GetValue(SourceProperty)'、 'SetValue(SourceProperty、value)'です。そこには 'ValueProperty'を使わないでください。私はそれがこの問題を引き起こしているとは思わないが、間違いなくバグだ。 –

答えて

1

は、あなたの依存関係プロパティで3つの変更を行います。System.Collections.IEnumerable(非ジェネリック)にそのタイプを変更し、SourcePropertySourcePropretyの名前を訂正し、かつGetValue()SetValue()(その最後のバグウォンにあなたの呼び出しでSourcePropertyではなくValuePropertyを使用します)Bindingが直接SetValue()GetValue()を呼び出しますが、それはまだバグだから「Tは、ComboBoxに影響を与える:

public static readonly DependencyProperty SourceProperty = 
    DependencyProperty.Register("Source", 
     typeof(IEnumerable), 
     typeof(ComboBoxWithButton), 
     new PropertyMetadata(null)); 

public IEnumerable Source 
{ 
    get { return (IEnumerable)GetValue(SourceProperty); } 
    set { SetValue(SourceProperty, value); } 
} 

の財産のあなたの定義型であると、コレクションを必要ObservableCollection<object>objectのみ、object以外。 ObservableCollection<MyItem>をバインドした場合は、ComboBoxが入力されません。 ComboBox.ItemsSourceのタイプはSystem.Collections.IEnumerableです(プロパティはItemsControlから継承されています)。それにこだわる。できます。何かのObservableCollectionはそれにバインドすることができます。詳細を把握させるにはComboBoxを入力してください。それが最高のことです。

次に、あなたの結合はSourceプロパティのUserControlDataContextを見ているが、それはUserControl自身の財産です。ここではそれを修正する方法は次のとおりです。

<ComboBox 
    x:Name="ComboBoxBtn" 
    VerticalAlignment="Top" 
    HorizontalAlignment="Left" 
    Margin="0,0,0,-1" 
    Width="100" 
    ItemsSource="{Binding Source, RelativeSource={RelativeSource AncestorType=UserControl}}" 
    > 

XAMLデザイナーがあなたにItemsSourceラインの下に青い波線を与える可能性があります。それがうんざりすると、ときどき混乱するだけです。

+0

私はその青いくすぐりを持っています。コントロールが見つからないと言っています。そして、私が実行すると例外がスローされます –

+0

@AndreRoque 'controls'を自分で定義しました。私はあなたの質問からそれをコピーしました。 UserControl XAMLで定義されていない場合は、そこに定義することができます。とにかく、 'controls:ComboBoxWithButton'の代わりに' UserControl'を試してみてください。私はそのようにするために私の答えを更新しました。 –

+0

それはそれでした!ありがとう! –

関連する問題