1

以下に示すように、テキストブロックとコンボ ボックスを含む再利用可能なユーザー コントロールがあります。

<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 にバインドしました。従業員の姓名を表示するテキスト ボックスを含むユーザー コントロールは正常に機能します。出力にバインディング エラーはありません。さらに、ユーザー コントロール内でコンボ ボックスを使用するのではなく、単純なコンボ ボックスを使用しても問題はありません。返信ありがとうございます。

4

1 に答える 1

2

これを理解するのに問題がありましたが、解決策はここにあります

于 2013-01-12T23:00:10.330 に答える