以下に示すように、テキストブロックとコンボ ボックスを含む再利用可能なユーザー コントロールがあります。
<UserControl ....>
<TextBlock DockPanel.Dock="Left" x:Name="label">Title:/TextBlock>
<ComboBox x:Name="comboBox" ></ComboBox>
</UserControl>
このコントロールのコード ビハインドで、次の依存関係プロパティを作成しました。
public partial class ctlCombobox : UserControl
{
public static readonly DependencyProperty DisplayMemberPathProperty = DependencyProperty.Register("DisplayMemberPath", typeof(string), typeof(ctlCombobox), new FrameworkPropertyMetadata() { BindsTwoWayByDefault = true });
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(ctlCombobox), new FrameworkPropertyMetadata() { BindsTwoWayByDefault = true });
public static readonly DependencyProperty SelectedIndexProperty = DependencyProperty.Register("SelectedIndex", typeof(int), typeof(ctlCombobox), new FrameworkPropertyMetadata() { BindsTwoWayByDefault = true });
public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register("SelectedItem", typeof(object), typeof(ctlCombobox), new FrameworkPropertyMetadata() { BindsTwoWayByDefault = true });
public static readonly DependencyProperty SelectedValuePathProperty = DependencyProperty.Register("SelectedValuePath", typeof(string), typeof(ctlCombobox), new FrameworkPropertyMetadata() { BindsTwoWayByDefault = true });
public static readonly DependencyProperty SelectedValueProperty = DependencyProperty.Register("SelectedValue", typeof(object), typeof(ctlCombobox), new FrameworkPropertyMetadata(OnSelectedValueChanged) { BindsTwoWayByDefault = true });
public ctlCombobox()
{
InitializeComponent();
Binding selectedIndexBinding = new Binding("SelectedIndex") { Source = this, Mode = BindingMode.TwoWay };
Binding itemsSourceItemBinding = new Binding("ItemsSource") { Source = this, Mode = BindingMode.TwoWay };
Binding displayMemberPathBinding = new Binding("DisplayMemberPath") { Source = this, Mode = BindingMode.OneWay };
Binding selectedItemBinding = new Binding("SelectedItem") { Source = this, Mode = BindingMode.TwoWay };
Binding selectedValueBinding = new Binding("SelectedValue") { Source = this, Mode = BindingMode.TwoWay };
Binding selectedValuePathBinding = new Binding("SelectedValuePath") { Source = this, Mode = BindingMode.TwoWay };
comboBox.SetBinding(ComboBox.SelectedIndexProperty, selectedIndexBinding);
comboBox.SetBinding(ComboBox.ItemsSourceProperty, itemsSourceItemBinding);
comboBox.SetBinding(ComboBox.DisplayMemberPathProperty, displayMemberPathBinding);
comboBox.SetBinding(ComboBox.SelectedItemProperty, selectedItemBinding);
comboBox.SetBinding(ComboBox.SelectedValueProperty, selectedValueBinding);
comboBox.SetBinding(ComboBox.SelectedValuePathProperty, selectedValuePathBinding);
}
public IEnumerable ItemsSource
{
get { return (IEnumerable)GetValue(ItemsSourceProperty); }
set { SetValue(ItemsSourceProperty, value); }
}
[Browsable(true)]
public int SelectedIndex
{
get { return (int)GetValue(SelectedIndexProperty); }
set { SetValue(SelectedIndexProperty, value); }
}
[Browsable(true)]
public object SelectedItem
{
get { return (object)GetValue(SelectedItemProperty); }
set { SetValue(SelectedItemProperty, value); }
}
[Browsable(true)]
public object SelectedValue
{
get { return (object)GetValue(SelectedValueProperty); }
set { SetValue(SelectedValueProperty, value); }
}
[Browsable(true)]
public string SelectedValuePath
{
get { return (string)GetValue(SelectedValuePathProperty); }
set { SetValue(SelectedValuePathProperty, value); }
}
}
以下に示すように、メイン コントロールで上記のコントロールを参照します。
<UserControl Name="mainControl" ...>
<DataGrid Name="lvEmployee" ItemsSource="{Binding Path=Employees, Mode=TwoWay}"
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<cc:ctlCombobox x:Name="cmbEmployeeType"
ItemsSource="{Binding Source={x:Reference mainControl}, Path=DataContext.EmployeeTypes}"
DisplayMemberPath="Name" SelectedValuePath="Id" SelectedValue="{Binding
Path=EmployeeTypeId}" ">
</cc:ctlCombobox>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
MVVM パターンを使用しています。私は、可能なすべての従業員タイプのルックアップになるように cmbEmployeeType を達成しようとしています。また、従業員が表示されている場合は、cmbEmployeeType で適切な従業員タイプを選択する必要があります。現在、メインのコントロールをロードすると、cmbEmployeeType コンボ ボックスが読み込まれますが、コンボ ボックスでは何も選択されません。コンボ ボックスを従業員の従業員タイプ ID にバインドしました。従業員の姓名を表示するテキスト ボックスを含むユーザー コントロールは正常に機能します。出力にバインディング エラーはありません。さらに、ユーザー コントロール内でコンボ ボックスを使用するのではなく、単純なコンボ ボックスを使用しても問題はありません。返信ありがとうございます。