1

ItemsControl から派生するカスタム コントロールを作成しました。

public class CustsomItemsControl : ItemsControl
{ }

XAML :

  <local:CustsomSelectorControl ItemsSource="{Binding People}"> 
        <local:CustsomSelectorControl.ItemTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Name}"/>                  
            </DataTemplate>
        </local:CustsomSelectorControl.ItemTemplate>
    </local:CustsomSelectorControl>     

コントロール テンプレート :

<Style TargetType="{x:Type local:CustsomItemsControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustsomItemsControl}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <ItemsPresenter />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

DataContext で:

   public MainWindow()
    {
        InitializeComponent();

        People = new ObservableCollection<Person>();
        People.Add(new Person("A"));
        People.Add(new Person("B"));
        People.Add(new Person("C"));
    }

    private ObservableCollection<Person> _people;
    public ObservableCollection<Person> People
    {
        get { return _people; }
        set
        {
            _people = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("People"));
        }
    }

アイテムは決して設定されません。スヌープでこれを観察しました。ItemsSource プロパティは赤でマークされてますが、BindingErrors はありません。BindingExpression を調べると、ArgumentExpression が得られます。

 Cannot set Expression. It is marked as 'NonShareable' and has already been used.
4

1 に答える 1

1

DataContext適切に設定します。

public MainWindow()
{
    InitializeComponent();
    DataContext = this; //This is what you're missing
    ...
}

それでも、 をサブクラス化するには、本当に強い理由が必要ですItemsControl

于 2013-05-27T17:12:54.667 に答える