C# 用于更改ViewModelClass(UWP)中的值的DependencyProperty
我有一个UserControl,它在坐标(X1、X2、Y1、Y2)绑定到ViewModelClass中的属性的地方绘制一些线,ViewModelClass本身处理绘制线的数学运算,UserControl的CodeBehind可以设置ViewModelClass中绘制线所需的属性值。以下代码解释了我的控件及其工作原理: UserControl.xamlC# 用于更改ViewModelClass(UWP)中的值的DependencyProperty,c#,xaml,mvvm,uwp,C#,Xaml,Mvvm,Uwp,我有一个UserControl,它在坐标(X1、X2、Y1、Y2)绑定到ViewModelClass中的属性的地方绘制一些线,ViewModelClass本身处理绘制线的数学运算,UserControl的CodeBehind可以设置ViewModelClass中绘制线所需的属性值。以下代码解释了我的控件及其工作原理: UserControl.xaml <Line x:Name="StartAngleLine" X1="{Binding Path=StartAngleX1}" X2="{Bi
<Line x:Name="StartAngleLine" X1="{Binding Path=StartAngleX1}" X2="{Binding Path=StartAngleX2}" Y1="{Binding Path=StartAngleY1}" Y2="{Binding Path=StartAngleY2}" Stroke="Aqua" StrokeThickness="6"/>
ViewModel.cs
public int StartAngle
{
get
{
return startAngle;
}
set
{
if (value != startAngle)
{
if (value >= 0 && value <= 360)
{
startAngle = value;
NotifyPropertyChanged();
StartAngleChanged();
}
else
{
throw new ArgumentOutOfRangeException($"StartAngle", "Angle is out of range.");
}
}
}
}
public double StartAngleX1
{
get
{
startAngleX1 = centerX + (centerX1 * Math.Cos(StartAngle * (Math.PI / 180)));
return startAngleX1;
}
}
private void StartAngleChanged()
{
NotifyPropertyChanged("StartAngleX1");
NotifyPropertyChanged("StartAngleX2");
NotifyPropertyChanged("StartAngleY1");
NotifyPropertyChanged("StartAngleY2");
}
public int StartAngle
{
得到
{
返回startAngle;
}
设置
{
if(值!=startAngle)
{
如果(value>=0&&value,则可以在UserControl中声明依赖项属性,如下所示:
public static readonly DependencyProperty StartAngleX1Property =
DependencyProperty.Register(
"StartAngleX1",
typeof(double),
typeof(MyUserControl),
new PropertyMetadata(0.0));
public double StartAngleX1
{
get { return (double)GetValue(StartAngleX1Property); }
set { SetValue(StartAngleX1Property, value); }
}
<UserControl ... x:Name="self">
...
<Line X1="{Binding StartAngleX1, ElementName=self}" .../>
...
</UserControl>
并在UserControl的XAML中绑定到它,如下所示:
public static readonly DependencyProperty StartAngleX1Property =
DependencyProperty.Register(
"StartAngleX1",
typeof(double),
typeof(MyUserControl),
new PropertyMetadata(0.0));
public double StartAngleX1
{
get { return (double)GetValue(StartAngleX1Property); }
set { SetValue(StartAngleX1Property, value); }
}
<UserControl ... x:Name="self">
...
<Line X1="{Binding StartAngleX1, ElementName=self}" .../>
...
</UserControl>
...
...
这样就不需要在UserControl中有私有视图模型
<mycontrol:MyUserControl StartAngleX1="{Binding SomeViewModelPropery}" ... />
我知道这是可能的,但这不是使用ViewModelClass来减少xaml.cs中代码量的原因吗?有很多原因可以解释为什么应该有一个视图模型。但是,UserControl不应该有自己的私有视图模型实例。相反,它应该在通过例如,DataContext属性,例如来自父控件、页面或窗口。当然,您可能在UserControl的代码中有一些登录。例如,StartAngle属性也可能是UserControl的依赖属性,并且控件可能会对PropertyChangedCallback(由PropertyMetadata传递)中的值更改作出反应。然后,它可能会更新其其他属性的值。至于第一条注释,感谢您的提示,我不知道!至于第二条注释,我将把属性获取到xaml.cs,并将StartAngle作为从属属性。如果StartAngle使用PropertyChange调用其对StartAngleX1、StartAngleX2等的更改,情况会如何dCallback?VisualStudio dep选项卡,您可以看到上面的内容。