2011-10-19 5 views
0

私はUserControlの複数のインスタンスでWPFで奇妙な動作を見ています。私は、ComboBoxItemsのコレクションをセットアップし、UserControlのインスタンスにバインドしようとしています。しかし、代わりに以下のようにそれらのすべてをそれに結びつけます。誰も私のコードを変更してアイテムが予想されるボックスに表示されるように知っていますか?WPF UserControl:コレクションはすべてのインスタンスにバインドされますか?

事前に感謝します。

Items appear in all combos

ウィンドウXAML

<Window x:Class="WpfUserControlSample.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfUserControlSample" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel Orientation="Horizontal" Height="30"> 
     <local:ToolbarButtonCombo x:Name="one" Text="Combo 1..."> 
      <local:ToolbarButtonCombo.MenuItems> 
       <ComboBoxItem>Item 1</ComboBoxItem> 
       <ComboBoxItem>Item 2</ComboBoxItem> 
      </local:ToolbarButtonCombo.MenuItems> 
     </local:ToolbarButtonCombo> 
     <local:ToolbarButtonCombo x:Name="two" Text="Combo 2..."> 
      <local:ToolbarButtonCombo.MenuItems> 
       <ComboBoxItem>Item 3</ComboBoxItem> 
       <ComboBoxItem>Item 4</ComboBoxItem> 
      </local:ToolbarButtonCombo.MenuItems> 
     </local:ToolbarButtonCombo> 
     <local:ToolbarButtonCombo x:Name="three" Text="Combo 3..."></local:ToolbarButtonCombo> 
    </StackPanel> 
</Window> 

ユーザーコントロールXAML

<UserControl x:Class="WpfUserControlSample.ToolbarButtonCombo" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="30" 
      Name="Control"> 
     <StackPanel Orientation="Horizontal"> 
       <Button Name="btn" Command="{Binding Path=ButtonCommand,ElementName=Control}"> 
        <TextBlock Text="{Binding Path=Text, ElementName=Control, FallbackValue=Label}"></TextBlock> 
       </Button> 
       <ComboBox x:Name="cmb" Margin="0,0,0,0" 
          ItemsSource="{Binding Path=MenuItems,ElementName=Control}"> 

       </ComboBox> 
     </StackPanel> 
</UserControl> 

ユーザーコントロール分離コード

namespace WpfUserControlSample 
{ 
    /// <summary> 
    /// Interaction logic for ToolbarButtonCombo.xaml 
    /// </summary> 
    public partial class ToolbarButtonCombo : UserControl 
    { 
     public ToolbarButtonCombo() 
     { 
      InitializeComponent(); 
     } 

     public static readonly DependencyProperty ButtonCommandProperty = 
      DependencyProperty.Register("ButtonCommand", typeof(ICommand), typeof(ToolbarButtonCombo)); 
     public ICommand ButtonCommand 
     { 
      get { return (ICommand)GetValue(ButtonCommandProperty); } 
      set { SetValue(ButtonCommandProperty,value);} 
     } 

     public static readonly DependencyProperty MenuItemsProperty = 
      DependencyProperty.Register("MenuItems", typeof(ObservableCollection<ComboBoxItem>), 
      typeof(ToolbarButtonCombo), new FrameworkPropertyMetadata(new ObservableCollection<ComboBoxItem>())); 
     public ObservableCollection<ComboBoxItem> MenuItems 
     { 
      get { return (ObservableCollection<ComboBoxItem>)GetValue(MenuItemsProperty); } 
      set { SetValue(MenuItemsProperty, value); } 
     } 

     public static readonly DependencyProperty TextProperty = 
      DependencyProperty.Register("Text", typeof(string), typeof(ToolbarButtonCombo)); 
     public string Text 
     { 
      get { return (string) GetValue(TextProperty);} 
      set { SetValue(TextProperty, value); } 
     } 
    } 
} 

答えて

1

MenuItemsプロパティが間違っています。

WPFのコレクションプロパティはread-onlyの依存プロパティで、(コンストラクタ内の各クラスインスタンス)の新しいコレクションを作成する必要があります。

コントロールのすべてのインスタンスに対して同じObservableCollection<ComboBoxItem>インスタンス(デフォルト値)を使用しているため、すべて同じアイテムを共有しています。

+0

パーフェクト - ありがとうございました! –

関連する問題