2011-10-19 41 views
0

我看到一个WPF中的一个奇怪的行为与UserControl的多个实例。我正在尝试设置ComboBoxItems的集合并将其绑定到UserControl的实例。但是,它将它们全部绑定到下面。有谁知道我会如何更改我的代码,以便项目出现在预期的框中?WPF UserControl:collection绑定到所有实例?

非常感谢提前!

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

完美 - 谢谢! –