WPF UserControl: коллекция привязывается ко всем экземплярам? - PullRequest
0 голосов
/ 19 октября 2011

Я вижу странное поведение в WPF с несколькими экземплярами UserControl. Я пытаюсь настроить коллекцию ComboBoxItems и связать ее с экземпляром 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 Ответ

1 голос
/ 19 октября 2011

Ваше MenuItems свойство неверно.

Свойства коллекции в WPF должны быть только для чтения свойства зависимости и , вам необходимо создать новую коллекцию для каждого экземпляра класса (в конструкторе).

Вы используете один и тот же экземпляр ObservableCollection<ComboBoxItem> (значение по умолчанию) для всех экземпляров элемента управления, поэтому все они используют одни и те же элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...