Я пытаюсь установить свойства Canvas в ItemsControl DataTemplate с Silverlight 3. Согласно этому сообщению, единственный способ сделать, который должен установить его с помощью ItemsContainerStyle для типа ContentPresenter, так как свойства Canvas только вступают в силу на прямых детях Холста. Это, кажется, не работает в SL3, так как ItemsControl не имеет свойства ItemsContainerStyle, таким образом, я попробовал ListBox, как рекомендуется этой статьей, но он все еще не работает. От XAML ниже, я ожидал бы видеть зеленый квадрат с номерами 10, 30, 50, 70, располагающимися каскадом от "NW" до направления "SE". Кто-либо может сказать мне, почему они все сложены друг на друге в углу NW?
10
30
50
70
Я тоже не могу объяснить, что вы видите. Ваш Xaml сломан по крайней мере двумя способами.
Во-первых, сам Xaml не работает, потому что это: -
<Style TargetType="ContentPresenter">
должно быть
<Style TargetType="ContentControl">
Контейнеры элементов в случае ListBox
имеют тип ListBoxItem
, производные от ContentControl
.
Тем не менее, без этого размещение {Binding} в установщиках стилей по-прежнему не работает. Думаю, вы представляли, что стиль будет применяться к каждому элементу по очереди и получить его значение из текущего элемента. Однако даже если бы привязка работала в этом стиле, был бы только один стиль, и он получал бы привязку данных из ListBox DataContext
. Это другой DataContext
, который применяется к каждому элементу ListBox (который в данном случае является каждым элементом в коллекции Items).
Тем не менее, я думаю, что у Бена есть разумное решение, которое исключает этот подход.
Я не уверен, сработает ли это в вашем сценарии, но я делал это в прошлом, используя RenderTransform.
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Background="Green" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding}">
<TextBox.RenderTransform>
<TranslateTransform X="100" Y="100" />
</TextBox.RenderTransform>
</TextBox>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.Items>
<System:Int32>10</System:Int32>
<System:Int32>30</System:Int32>
<System:Int32>50</System:Int32>
<System:Int32>70</System:Int32>
</ItemsControl.Items>
</ItemsControl>
Или в случае привязки вам нужно будет использовать конвертер
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Background="Green" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding}" RenderTransform="{Binding Converter={StaticResource NumberToTransformGroupConverter}}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.Items>
<System:Int32>10</System:Int32>
<System:Int32>30</System:Int32>
<System:Int32>50</System:Int32>
<System:Int32>70</System:Int32>
</ItemsControl.Items>
</ItemsControl>
public void ConvertTo(object value, ...)
{
int intValue = int.Parse(value.ToString());
return new TransformGroup()
{
Children = new TransformCollection()
{
new TranslateTransform { X = intValue, Y = intValue }
}
};
}