Привязка WPF в ItemTemplate для настраиваемого элемента управления ItemControl

Я добавляю настраиваемый элемент управления WPF и делаю его производным от ItemsControl. Класс называется IC4 и объявлен следующим образом:

public class IC4 : ItemsControl

Я добавляю к нему следующие свойства:

    public class P
    {
        public string S { get; set; }
        public string T { get; set; }
    }

    public List<P> LP { get; set; } = new List<P>();

Затем в конструкторе делаю следующее:

    public IC4()
    {
        LP.Add(new P { S = "fred", T = "jim" });
        LP.Add(new P { S = "fred", T = "jim" });
        this.ItemsSource = LP;
        this.DataContext = this;
    }

Visual studio добавила запись стиля в themes / generic.xaml - я изменил ее следующим образом:

<Style TargetType="{x:Type local:IC4}">
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <Grid>
                    <!-- this is almost certainly wrong: -->
                    <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=S}"/>
                </Grid>
            </DataTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:IC4}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <ItemsPresenter/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

В mainwindow.xaml я добавил:

    <StackPanel>
        <Label Content="before"/>
        <local:IC4 ItemsSource="{Binding LP}"/>
        <Label Content="after"/>
    </StackPanel>

Я почти уверен, что привязка текстового поля в шаблоне данных неверна, поскольку я получаю следующую ошибку времени выполнения (показанную в окне вывода):

System.Windows.Data Error: 40 : BindingExpression path error: 'S' property not found on 'object' ''ContentPresenter' (Name='')'. BindingExpression:Path=S; DataItem='ContentPresenter' (Name=''); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

Как настроить привязку для отображения элементов S свойства LP?

(Обратите внимание, что для простоты меня не интересуют уведомления об изменении свойств).

Спасибо


person Adrian S    schedule 02.02.2016    source источник
comment
В дополнение к тому, что dkozl сказал, вы также жестко кодируете свой DataContext в своем конструкторе, что означает, что все, что вы пытаетесь передать он, например ItemsSource="{Binding LP}", не будет работать должным образом. Никогда не следует жестко кодировать свой DataContext в любом подобном UserControl, потому что он предотвращает использование любых других данных с этим UserControl.   -  person Rachel    schedule 02.02.2016


Ответы (1)


Насколько я понимаю, это должно быть просто

<DataTemplate>
    <Grid>
        <TextBlock Text="{Binding Path=S}"/>
    </Grid>
</DataTemplate>

DataContext каждого элемента, поэтому для всего в вашем ItemTemplate будет экземпляр класса P, поэтому все, что вам нужно указать, это Path

person dkozl    schedule 02.02.2016