UserControl:此 PlotModel 已被其他 PlotView 控件使用

UserControl: This PlotModel is already in use by some other PlotView control

我知道这个问题已经发布了,但我不明白答案。在我的例子中,我有一个只有 UserControl 的项目:

<UserControl x:Class="SimpleOxyPlotUserControl.UserControl1View"
             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:SimpleOxyPlotUserControl"
             xmlns:oxy="http://oxyplot.org/wpf"
             mc:Ignorable="d" 
             x:Name="uc1"
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <oxy:PlotView Model="{Binding ElementName=uc1, Path=OxyPlotModel, Mode=TwoWay}"/>
    </Grid>
</UserControl>

及其背后的代码:

using System.Windows;
using System.Windows.Controls;
using OxyPlot;

namespace SimpleOxyPlotUserControl
{
    /// <summary>
    /// Interaction logic for UserControl1View.xaml
    /// </summary>
    public partial class UserControl1View : UserControl
    {
        public UserControl1View() => InitializeComponent();

        public PlotModel OxyPlotModel
        {
            get { return (PlotModel)GetValue(OxyPlotModelProperty); }
            set { SetValue(OxyPlotModelProperty, value); }
        }

        public static readonly DependencyProperty OxyPlotModelProperty =
            DependencyProperty.Register("OxyPlotModel", typeof(PlotModel), typeof(UserControl1View),
                new PropertyMetadata(new PlotModel()));
    }
}

然后我有另一个项目,其中包含一个简单的 WPF 应用程序及其 MainWindow.xaml:

<Window x:Class="SimpleOxyPlotUserControlApp.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:simpleOxyPlotUserControl="clr-namespace:SimpleOxyPlotUserControl;assembly=SimpleOxyPlotUserControl"
        Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <simpleOxyPlotUserControl:UserControl1View/>
        <simpleOxyPlotUserControl:UserControl1View Grid.Row="1"/>
    </Grid>
</Window>

及其背后的代码:

using System.Windows;

namespace SimpleOxyPlotUserControlApp.Views
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

我收到错误消息“InvalidOperationException:此 PlotModel 已被其他 PlotView 控件使用。”

我知道这是因为每个 Oxy PlotModel 只能连接到一个 Oxy PlotView。但是,当我插入我的 UserControl 时,为什么每次都不创建一个新的 Oxy PlotView 和 PlotModel?我怎样才能确保它这样做?

OxyPlotModelProperty 在 PropertyMetadata 中注册了 new PlotModel() 默认值。但是 OxyPlotModelProperty 是静态的,因此您可以为所有 UserControl1View 实例获得相同的 PlotModel 实例。

通过在构造函数中创建 PlotModel 来修复它:

public partial class UserControl1View : UserControl
{
    public UserControl1View() 
    {
        InitializeComponent();
        SetLocalValue(OxyPlotModelProperty, new PlotModel());
    }

    public PlotModel OxyPlotModel
    {
        get { return (PlotModel)GetValue(OxyPlotModelProperty); }
        set { SetValue(OxyPlotModelProperty, value); }
    }

    public static readonly DependencyProperty OxyPlotModelProperty =
        DependencyProperty.Register("OxyPlotModel", typeof(PlotModel), typeof(UserControl1View),
            new PropertyMetadata(null));
}