私はSharpComboBoxというUserControlを持っています。 MVVMモデルを使用して、SharpComboBoxにカテゴリを設定しています。そのためにItemsSourceプロパティを設定する必要があります。 SharpComboBoxコントロールの使い方を以下に示します。依存プロパティWPF常にNULLを返す
<sharpControls:SharpComboBox ItemsSource="{Binding Path=Categories}" Grid.Column="1" Grid.Row="1" DisplayMemberPath="Title">
</sharpControls:SharpComboBox>
ウィンドウがAddBook.xamlと呼ばれ、ここでの背後にあるコードです:
public AddBooks()
{
InitializeComponent();
this.DataContext = new AddBookViewModel();
}
そして、ここではAddBookViewModelの実装です。ここ
public class AddBookViewModel
{
private CategoryRepository _categoryRepository;
public AddBookViewModel()
{
_categoryRepository = new CategoryRepository();
}
public List<Category> Categories
{
get
{
return _categoryRepository.GetAll();
}
}
そして最後にSharpComboBoxコントロールです:ItemsSourceプロパティは常にnullであるいくつかの理由
public partial class SharpComboBox : UserControl
{
public static DependencyProperty ItemsSourceProperty;
public SharpComboBox()
{
InitializeComponent();
this.DataContextChanged += new System.Windows.DependencyPropertyChangedEventHandler(SharpComboBox_DataContextChanged);
ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof (IEnumerable),
typeof (SharpComboBox), null);
comboBox.ItemsSource = ItemsSource;
}
public IEnumerable ItemsSource
{
get { return (IEnumerable) GetValue(ItemsSourceProperty); }
set { SetValue(ItemsSourceProperty, value); }
}
void SharpComboBox_DataContextChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e)
{
}
:
<StackPanel Name="stackPanel">
<ComboBox x:Name="comboBox">
<ComboBox.ItemTemplate>
<DataTemplate>
<ItemsControl>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="2*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
</Grid>
<TextBlock Grid.Column="0" Grid.Row="0" Text="{Binding Path=Title}" Margin="10" />
<Image Grid.Column="1" Margin="10" Grid.Row="0" Width="100" Height="100" Stretch="Fill" Source="{Binding Path=ImageUrl}">
</Image>
</ItemsControl>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</StackPanel>
そしてここでは、背後にあるコードです。
更新日:
あなたは、単にコンストラクタで一度あなたの財産からcomboBox.ItemsSourceを設定することはできませんvoid SharpComboBox_DataContextChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e)
{
var binding = new Binding();
binding.Source = this.DataContext;
**binding.Path = new PropertyPath("Categories");**
comboBox.SetBinding(ComboBox.ItemsSourceProperty, binding);
}
コードビューからコントロールを参照して強制的に更新する必要がある場合は、コードムールが正しくないか、INotifyPropertyChangedを使用して更新する必要があるバインディングを通知しない場合があります。 –
また、MVVMを使用してアプリケーションを設計しようとするときに、目標である0コードビハインドを見ることをお勧めします。それは完全に可能です。 –