Я пытаюсь привязать наблюдаемую коллекцию прямоугольников к элементу управления элементами с холстом в качестве панели элементов, но, похоже, нет способа привязать свойства Canvas.Left
и Canvas.Top
к элементам Rectangle. Я попытался сделать это, добавив ItemsControl.ItemContainerStyle, как в WPF, но, похоже, этого не существует в Авалонии.
Я искал и нашел это: https://github.com/AvaloniaUI/Avalonia/discussions/10018
Однако я не смог найти ссылку на ItemContainerTheme в документации Avalonia.
Это то, что у меня есть на данный момент:
<ItemsControl Grid.Row = "1" Items = "{Binding Rectangles}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType = "ContentPresenter">
<Setter Property = "Canvas.Left" Value = "{Binding Path=X}" />
<Setter Property = "Canvas.Top" Value = "{Binding Path=Y}" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Fill = "Red" Width = "{Binding Width}" Height = "{Binding Height}"></Rectangle>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Это модель представления для каждого элемента, к которому привязан шаблон элементов:
public class RectangleViewModel : ViewModelBase
{
private int _x = 0;
public int X
{
get => _x;
set => this.RaiseAndSetIfChanged(ref _x, value);
}
private int _y = 0;
public int Y
{
get => _y;
set => this.RaiseAndSetIfChanged(ref _y, value);
}
private int _width = 0;
public int Width
{
get => _width;
set => this.RaiseAndSetIfChanged(ref _width, value);
}
private int _height = 0;
public int Height
{
get => _height;
set => this.RaiseAndSetIfChanged(ref _height, value);
}
}
А это моя коллекция прямоугольников:
public ObservableCollection<RectangleViewModel> Rectangles { get; } = new();
вы пробовали ItemsControl.ItemContainerTheme вместо ItemContainerStyle? github.com/AvaloniaUI/Avalonia/discussions/10060
Спасибо за ответ. Я не смог найти ссылку на ItemContainerTheme в документации. Это должно быть сложнее, чем замена ItemsControl.ItemContainerStyle на ItemsControl.ItemContainerTheme, поскольку он не найден.
Решено. Мне удалось найти несколько связанную проблему Github здесь https://github.com/AvaloniaUI/Avalonia/issues/2302, которая использует прикрепленный атрибут Styles
для добавления свойств Canvas.Left
и Canvas.Top
.
Фиксированный результат:
<ItemsControl Grid.Row = "1" Items = "{Binding Rectangles}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Styles>
<Style Selector = "ItemsControl > ContentPresenter">
<Setter Property = "Canvas.Left" Value = "{Binding X}"/>
<Setter Property = "Canvas.Top" Value = "{Binding Y}"/>
</Style>
</ItemsControl.Styles>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Stroke = "#00FF00" StrokeThickness = "2" Fill = "Transparent" Width = "{Binding Width}" Height = "{Binding Height}"></Rectangle>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Я думаю (и именно поэтому это комментарий, а не ответ), что
Canvas.Left
иCanvas.Top
являются присоединенными свойствами, и поэтому они работают по-разному. Я никогда не пытался изменить прикрепленное свойство с помощью установщика стиля. Возможно, это не работает? Или, может быть, это не работает в Авалонии?