HelixToolkit:绑定到UserControl中Torus控件的TubeDiameter属性会产生错误

问题描述

我有以下Torusviewmodel用作MainWindow的数据上下文:

public class Torusviewmodel : ModelVisual3D,INotifyPropertyChanged
{
    private double _torusdiameter = 10.0;
    private double _tubediameter = 0.010;

    public event PropertyChangedEventHandler PropertyChanged;
    public Torusviewmodel()
    {
    }

    // diameter property
    public double myTorusDiameter
    {
        get
        {
            return _torusdiameter;
        }
        set
        {
            _torusdiameter = value;
            OnPropertyChanged("myTorusDiameter");
        }
    }

    // tube diameter property

    public double myTubediameter
    {
        get
        {
            return _tubediameter;
        }
        set
        {
            _tubediameter = value;
            OnPropertyChanged("myTubediameter");
        }
    }

    private void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
            PropertyChanged(this,new PropertyChangedEventArgs(property));
    }
}

这是我对MainWindow的简单XAML:

<Grid>

        <local:TorusUserControl x:Name="UC1" Padding="5"  UCTorusDiameter="{Binding Path=myTorusDiameter,Mode=TwoWay}"
                               UCTubediameter="{Binding Path=myTubediameter,Mode=TwoWay}"
                               />
</Grid>

使用以下UserControl XAML可以正常工作:

<UserControl x:Class="Torus2020A.TorusUserControl"
         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:hx="clr-namespace:HelixToolkit.Wpf;assembly=HelixToolkit.Wpf"
         xmlns:local="clr-namespace:Torus2020A"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
<Grid>
    <DockPanel>
        <hx:HelixViewport3D x:Name="UCTorusView"
                        ModelUpDirection="0,1,0"
                        ZoomExtentsWhenLoaded="True"  
                        ShowCoordinateSystem="True" 
                        PanGesture="LeftClick">
            <hx:TorusVisual3D x:Name="UCTorus"  
            TorusDiameter="{Binding Path=UCTorusDiameter,RelativeSource={RelativeSource AncestorType=UserControl,AncestorLevel=1},Mode=TwoWay}"
            Tubediameter="1"
             ThetaDiv="36"
             PhiDiv="24"
             />
            <hx:DefaultLights/>
        </hx:HelixViewport3D>
    </DockPanel>
</Grid>

但是,当我使用与TorusDiameter属性相同的绑定方案将Tubediameter属性绑定到DependencyProperty时,如下所示:

<hx:TorusVisual3D x:Name="UCTorus"  
            TorusDiameter="{Binding Path=UCTorusDiameter,Mode=TwoWay}"
            Tubediameter="{Binding Path=UCTubediameter,Mode=TwoWay}"
             ThetaDiv="36"
             PhiDiv="24"
             />

我得到一个例外。这是我为UserControl编写的代码

public partial class TorusUserControl : UserControl
{
    //private Torusviewmodel UCVisual = new Torusviewmodel();
    //public ModelVisual3D UCModel = new ModelVisual3D();

    public TorusUserControl()
    {
        InitializeComponent();

        //ModelVisual3D UCModel = new ModelVisual3D();

        //UCTorus.Fill = Brushes.Red;
        //UCTorus.TorusDiameter = 10;
        //CTorus.Tubediameter = 1;
        //UCTorus.Transform = new TranslateTransform3D(0,2,0);

        UCTorusView.Background = Brushes.Aquamarine;

        //UCTorusView.Children.Add(UCTorus);

        //UCModel.Children.Add(UCTorus);
        //UCTorusView.Children.Add(UCTorus);
    }

    public static readonly DependencyProperty UCTorusDiameterProperty =
        DependencyProperty.Register("UCTorusDiameter",typeof(double),typeof(TorusUserControl));
    public double UCTorusDiameter
    {
        get { return (double)GetValue(UCTorusDiameterProperty); }
        set { SetValue(UCTorusDiameterProperty,value); }
    }

    public static readonly DependencyProperty UCTubediameterProperty =
        DependencyProperty.Register("UCTubediameter",typeof(TorusUserControl));
    public double UCTubediameter
    {
        get { return (double)GetValue(UCTubediameterProperty); }
        set { SetValue(UCTubediameterProperty,value); }
    }

}

对于可能做错事情的任何提示,我将不胜感激。

解决方法

事实证明,这是HelixToolkit中的一个小错误。解决方法如下所示:

Torus class TubeDiameter Property binding fails