ScottPlot не отображает при использовании шаблона данных

#c# #wpf #xaml #scottplot

#c# #wpf #xaml #скоттплот

Вопрос:

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

Это мое мнение:

 <Window x:Class="Client.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:Client"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <DataTemplate x:Key="DataPlotTemplate">
            <StackPanel>
                <TextBlock Text="{Binding Title}"/>
                <WpfPlot MinHeight="300" MinWidth="300" Content="{Binding DataPlot}"/>
                <TextBlock Text="{Binding Description}"/>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <ContentControl Content="{Binding DataPlotVm0}"
                            ContentTemplate="{StaticResource DataPlotTemplate}"/>
            <ContentControl Content="{Binding DataPlotVm1}"
                            ContentTemplate="{StaticResource DataPlotTemplate}"/>
        </StackPanel>
    </Grid>
</Window>
 

Это моя модель представления:

 public class DataPlotViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChange(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private string title = "";
    public string Title
    {
        get { return title; }
        set
        {
            title = value;
            OnPropertyChange("Title");
        }
    }

    public ScottPlot.WpfPlot DataPlot { get; set; } = new ScottPlot.WpfPlot();

    private string description = "";
    public string Description
    {
        get { return description; }
        set
        {
            description = value;
            OnPropertyChange("Description");
        }
    }
}
 

Когда DataPlot для построения графика используется модель вида, ничего не отображается.

Ответ №1:

График Скотта не реализован как надлежащий элемент управления WPF, который поддерживает привязку данных и MVVM.

ScottPlot стремится быть простым в использовании для специалистов по обработке данных, не знакомых с C #, поэтому его API поддерживает простоту однострочных вызовов методов (с необязательными именованными аргументами) и намеренно избегает сложных парадигм (привязка данных, MVVM, наследование), которые обычно встречаются в аналогичных библиотеках, доступных для платформы .NET.

На GitHub есть аналогичная проблема, которая описывает, что вы можете сделать.

Вы можете создать WpfPlot в ViewModel […] и привязать его к вашему представлению […]
Это плохой шаблон для передачи управления виртуальной машине, но он должен работать.

Как уже заявляет автор, это плохой шаблон, поскольку ваша модель представления будет содержать элемент управления пользовательского интерфейса. Однако в настоящее время нет поддержки привязки данных для WpfPlot . Согласно проблеме, несмотря на нарушение MVVM, это работает:

 <DataTemplate x:Key="DataPlotTemplate">
   <StackPanel>
      <TextBlock Text="{Binding Title}"/>
      <ContentControl MinHeight="300" MinWidth="300" Content="{Binding DataPlot}"/>
      <TextBlock Text="{Binding Description}"/>
   </StackPanel>
</DataTemplate>
 

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