#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>
Конечно, вы могли бы создать пользовательский элемент управления и адаптировать его или использовать другие обходные пути для привязки, но я не думаю, что это целесообразно, поскольку сам элемент управления официально не предлагает никакой поддержки для этого в любом случае.