2011-10-19 1 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> 

UserControl을 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> 

UserControl을 Codebehind가

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

완벽 - 고마워요! –