WPF Canvas не отображает фигуры, связанные с ItemsControl - PullRequest
0 голосов
/ 30 апреля 2019

Я создаю полигоны в коде, которые добавляются в общий ObservableList.Это моя ViewModel.

class CanvasViewModel : ModelBase
{
    private WpfObservableRangeCollection<Shape> CanvasShapes { get; set; }
//...
}

Форма - это правильные формы WPF.Нет контейнера или что-нибудь.Кроме того, я установил стиль этих фигур также программно, например:

public void ApplyStyle(Style style)
    {
        style.Setters.Add(new Setter(Shape.FillProperty, Brushes.DodgerBlue));
    }

Как вы можете видеть, я определенно устанавливаю цвет для этих фигур.Моя проблема в том, что в моей программе, когда я запускаю ее, холст визуализируется (я вижу это, когда я устанавливаю фон холста любого цвета), но ни одна из фигур, которые я добавляю в ObservableRangeCollection (они определенно находятся вcollection.)

Вот код страницы для CanvasPage:

<ItemsControl ItemsSource="{Binding CanvasShapes}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

Я полагаю, что это правильные формы WPF, и мне не нужно добавлять к ним какие-либо шаблоны данных или что-то еще, однакоЯ думаю, что именно здесь я ошибаюсь.

А вот CodeBehind of the Window, который в настоящее время инициализирует эти функции (я знаю, что это плохая практика, просто запустить программу для тестирования):

public MainWindow()
    {
        InitializeComponent();
        CanvasPage canvasPage = new CanvasPage()
        //boilerplate...
        var canvasViewModel = new CanvasViewModel(...);
        canvasPage.DataContext = canvasViewModel;
        this._NavigationFrame?.Navigate(canvasPage);
    }

Вот MCV-версия этой проблемы:

Viewmodel.cs

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using System.Windows.Shapes;

namespace MVCE
{
    class ViewModel
    {
        public ObservableCollection<Shape> CanvasShapes;

        public ViewModel()
        {
            CanvasShapes = new ObservableCollection<Shape>();
            var polygon = new Polygon();
            var pointCollection = new PointCollection
            {
                new Point(100, 100),
                new Point(100, -100),
                new Point(-100, -100),
                new Point(-100, 100)
            };
            polygon.Points = pointCollection;
            Style style = new Style();
            style.Setters.Add( new Setter(Shape.FillProperty, Brushes.Aquamarine));

            polygon.Style = style;
            CanvasShapes.Add(polygon);
        }
    }
}

MainWindow.cs

<Window x:Class="MVCE.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MVCE"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <DockPanel>
        <Frame x:Name="_NavigationFrame" NavigationUIVisibility="Hidden" />
    </DockPanel>

</Window>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace MVCE
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            ViewModel viewModel = new ViewModel();
            var page = new Page1();
            page.DataContext = viewModel;
            _NavigationFrame.Navigate(page);
        }
    }
}

CanvasPage.xaml (файл .cs по умолчанию)

<Page x:Class="MVCE.Page1"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:MVCE"
      mc:Ignorable="d" 
      d:DesignHeight="450" d:DesignWidth="800"
      Title="Page1">

    <ItemsControl ItemsSource="{Binding CanvasShapes}" Background="Brown">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</Page>

1 Ответ

0 голосов
/ 30 апреля 2019

Я понял это.

Проблема заключалась в том, что моя ObservableCollection в моей ViewModel была настроена как конфиденциальная. Из-за этого у DataBinding, похоже, возникли проблемы. Я думал, что это сработает из-за размышлений, но я ошибся. Настройка коллекции на публичное исправление сразу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...