Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF UserControl:集合绑定到所有实例?_C#_Wpf - Fatal编程技术网

C# WPF UserControl:集合绑定到所有实例?

C# WPF UserControl:集合绑定到所有实例?,c#,wpf,C#,Wpf,我在WPF中看到了一个奇怪的行为,有多个UserControl实例。我正在尝试设置ComboBoxItems的集合,并将其绑定到UserControl的实例。但它却把所有的人都绑在上面,如下图所示。有人知道我如何更改代码,使项目显示在预期框中吗 非常感谢 窗口Xaml <Window x:Class="WpfUserControlSample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/p

我在WPF中看到了一个奇怪的行为,有多个UserControl实例。我正在尝试设置ComboBoxItems的集合,并将其绑定到UserControl的实例。但它却把所有的人都绑在上面,如下图所示。有人知道我如何更改代码,使项目显示在预期框中吗

非常感谢

窗口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 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>

项目1
项目2
项目3
项目4
用户控制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 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); }
        }
    }
}
命名空间WpfUserControlSample
{
/// 
///ToolbarButtonCombo.xaml的交互逻辑
/// 
公共部分类ToolbarButtonCombo:UserControl
{
公共工具栏按钮mbo()
{
初始化组件();
}
公共静态只读从属属性ButtonCommandProperty=
DependencyProperty.Register(“ButtonCommand”、typeof(ICommand)、typeof(Toolbar ButtonCombo));
公用ICommand按钮命令
{
获取{return(ICommand)GetValue(ButtonCommandProperty);}
set{SetValue(ButtonCommandProperty,value);}
}
公共静态只读从属属性菜单项属性=
DependencyProperty.Register(“菜单项”),类型(ObservableCollection),
typeof(ToolbarButtonCombo),新的框架属性ymetadata(新的observedcollection());
公共可观测集合菜单项
{
get{return(ObservableCollection)GetValue(MenuItemsProperty);}
集合{SetValue(MenuItemsProperty,value);}
}
公共静态只读DependencyProperty TextProperty=
Register(“Text”、typeof(string)、typeof(ToolbarButtonCombo));
公共字符串文本
{
获取{return(string)GetValue(TextProperty);}
set{SetValue(TextProperty,value);}
}
}
}

您的
MenuItems
属性错误

WPF中的集合属性应该是依赖属性,您需要为每个类实例(在构造函数中)创建一个新集合

您正在为控件的所有实例使用相同的
observateCollection
实例(默认值),因此它们都共享相同的项