Я добавляю настраиваемый элемент управления 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?
(Обратите внимание, что для простоты меня не интересуют уведомления об изменении свойств).
Спасибо
ItemsSource="{Binding LP}"
, не будет работать должным образом. Никогда не следует жестко кодировать свой DataContext в любом подобном UserControl, потому что он предотвращает использование любых других данных с этим UserControl. - person Rachel   schedule 02.02.2016