C# 用于更改ViewModelClass(UWP)中的值的DependencyProperty

C# 用于更改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

我有一个UserControl,它在坐标(X1、X2、Y1、Y2)绑定到ViewModelClass中的属性的地方绘制一些线,ViewModelClass本身处理绘制线的数学运算,UserControl的CodeBehind可以设置ViewModelClass中绘制线所需的属性值。以下代码解释了我的控件及其工作原理:

UserControl.xaml

<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选项卡,您可以看到上面的内容。