使用Button创建UserControl ComboBox

时间:2016-09-29 14:59:38

标签: c# wpf xaml combobox user-controls

我尝试创建一个带有项目列表的ComboBox的UserControl,然后我想添加一个按钮来执行某些操作。

我有这段代码:

ComboBoxWithButton XAML:

<ComboBox x:Name="ComboBoxBtn" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="0,0,0,-1" Width="100" ItemsSource="{Binding Source}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <Label Content="{Binding }" Width="100" />
                    <Button Grid.Column="1">Something</Button>
                </Grid>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

ComboBoxWithButton代码:

public ComboBoxWithButton()
        {
            InitializeComponent();
        }


        public static readonly DependencyProperty SourceProprety =
            DependencyProperty.Register("Source", typeof(ObservableCollection<object>), typeof(ComboBoxWithButton), new PropertyMetadata(null));

        public ObservableCollection<object> Source
        {
            get { return (ObservableCollection<object>)GetValue(ValueProprety); }
            set { SetValue(ValueProprety, value); }
        }

然后在我的窗口我打电话:

<controls:ComboBoxWithButton Source="{Binding SomeCollection}"/>

但是组合框是空的

1 个答案:

答案 0 :(得分:1)

在您的依赖项属性中进行三项更改:将其类型更改为System.Collections.IEnumerable(非通用),将SourceProprety的名称更正为SourceProperty,然后使用SourceProperty调用ValuePropertyGetValue()的时间比SetValue()更长(最后一个错误不会影响ComboBox,因为Binding会调用SetValue()GetValue()直接,但它仍然是一个错误):

public static readonly DependencyProperty SourceProperty =
     DependencyProperty.Register("Source", 
         typeof(IEnumerable), 
         typeof(ComboBoxWithButton), 
         new PropertyMetadata(null));

public IEnumerable Source
{
    get { return (IEnumerable)GetValue(SourceProperty); }
    set { SetValue(SourceProperty, value); }
}

您对属性的定义要求集合属于ObservableCollection<object>类型。只有object,只有object。如果您将ObservableCollection<MyItem>绑定到它,则无法填充ComboBoxComboBox.ItemsSource的类型为System.Collections.IEnumerable(该属性继承自ItemsControl)。坚持下去。有用。任何ObservableCollection任何东西都可以绑定到那个。让ComboBox弄清楚细节;这是它最擅长的。

接下来,您的绑定正在查看UserControl DataContext Source属性的UserControl,但它是<ComboBox x:Name="ComboBoxBtn" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="0,0,0,-1" Width="100" ItemsSource="{Binding Source, RelativeSource={RelativeSource AncestorType=UserControl}}" > 本身的属性。以下是解决这个问题的方法:

ItemsSource

XAML设计师可能会在/home/user/.felix/行下给你一个蓝色波浪线。让它呻吟,它有时会感到困惑。