이 부분은 라이브러리를 사용하는 입장에서 당연히 나타날 수 있는 문제이기 때문에 감안하셔야 합니다.
이러한 문제 때문에 일부 회사에서는 프로젝트 진행하는 동안 라이브러리 버전을 고정해서 사용합니다.
제가 간단하게 확인해봤는데 WpfPlot
을 하위속성으로 갖는 UserControl
을 만들면 가장 쉽고 간단할 것 같아보여요.
뷰모델에서 뷰에 접근하는 방식이면 나중 유지보수가 어마어마하게 어려워 질 수 있기 때문입니다.
<!-- MyPlot.xaml -->
<UserControl x:Class="Scottplot_WPF.MyPlot"
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:Scottplot_WPF"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<WpfPlot x:Name="PlotView"/>
</UserControl>
// MyPlot.xaml.cs
public partial class MyPlot : UserControl
{
public static readonly DependencyProperty ScattersProperty = DependencyProperty.Register(
nameof(Scatters), typeof(ICollection<Scatter>), typeof(MyPlot), new FrameworkPropertyMetadata(OnScattersChanged));
public ICollection<Scatter>? Scatters
{
get => GetValue(ScattersProperty) as ICollection<Scatter>;
set => SetValue(ScattersProperty, value);
}
public MyPlot()
{
InitializeComponent();
}
private static void OnScattersChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is not MyPlot myPlot)
return;
if (e.NewValue is not ICollection<Scatter> scatters)
return;
myPlot.PlotView.Plot.Clear();
foreach (var scatter in scatters)
{
myPlot.PlotView.Plot.AddScatter(scatter.XDatas, scatter.YDatas);
}
myPlot.PlotView.Refresh();
}
}
<!-- MyPlot를 사용하려는 곳에서 -->
...
<local:MyPlot Scatters="{Binding Scatters}"/>
...
// MyPlot를 사용하려는 곳의 ViewModel
...
// 만약 속성이 변할 수 있으면 ICollection 대신 ObservableCollection이나 BindingList
public ICollection<Scatter> Scatters { get; set; }
...
여기서 나온 Scatter
는 제가 임시로 만든 자료구조인데 사용환경에 맞게 작성하면 될 것 같아요.
파일을 압축해서 올리려 했는데 업로드 제한에 걸리네요…
public readonly struct Scatter
{
public double[] XDatas { get; }
public double[] YDatas { get; }
public Scatter(double[] xDatas, double[] yDatas)
{
XDatas = xDatas;
YDatas = yDatas;
}
}