Теперь я не уверен, что вы делаете, поскольку ваш класс расширяет Control, поэтому я предполагаю, что вы создаете пользовательский элемент управления, поэтому мой ответ основан на этом. Я также предполагаю, что NamePrefixes никогда не меняется, поэтому вы используете для него статический элемент.
Я бы пропустил статику и сделал бы следующее:
public class NameField : Control
{
private const String ElementPrefixBox = "PART_PrefixBox";
public ObservableCollection<NamePrefix> NamePrefixes {get;private set;}
public NameField()
{
NamePrefixes = new ObservableCollection<NamePrefix>();
}
}
<Style TargetType="{x:Type local:NameField}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:NameField}">
<StackPanel Orientation="Horizontal">
<TextBlock TextWrapping="NoWrap" Text="Name:" VerticalAlignment="Center" Margin="3" />
<ListBox x:Name="PART_PrefixBox"
VerticalAlignment="Center"
Margin="3"
ItemsSource="{Binding NamesPrefix, RelativeSource={RelativeSource FindAncestor, Ancestortype=Whatever}}" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Вы связываете ItemsSource с корнем пользовательского элемента управления (из вашего кода не видно, что это такое). Возможно, вы сможете применить имя к своему корню, а затем просто использовать ElementName=
, IIRC иногда работает.
Если вам АБСОЛЮТНО нужно сделать его статичным, поскольку ВСЕ элементы управления должны обновляться при обновлении любого из них, тогда вы можете сделать наблюдаемую коллекцию статической и привязать ItemsSource к {x: Static local: NameField.NamesPrefix}. Просто поймите, что вы можете связывать только с общими свойствами, а не с полями или методами (без использования источника данных объекта или чего-то еще).