问题描述
我有以下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"
/>
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中的一个小错误。解决方法如下所示: