我尝试创建一个带有项目列表的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}"/>
但是组合框是空的
答案 0 :(得分:1)
在您的依赖项属性中进行三项更改:将其类型更改为System.Collections.IEnumerable
(非通用),将SourceProprety
的名称更正为SourceProperty
,然后使用SourceProperty
调用ValueProperty
和GetValue()
的时间比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>
绑定到它,则无法填充ComboBox
。 ComboBox.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/
行下给你一个蓝色波浪线。让它呻吟,它有时会感到困惑。