C# Wpf中的动态变换器

C# Wpf中的动态变换器,c#,wpf,mvvm,C#,Wpf,Mvvm,我有控制权 首先,我有十进制类型的坐标 在第二个选项卡项中,我有DMS类型的坐标 当用户更改其中一项时,我希望此更改将影响第二种类型 现在,只有当我运行笛卡尔坐标的应用程序控件时,它才起作用。但是,当我在十进制坐标系中运行后更改某些内容时,笛卡尔坐标系的控件中没有任何更改 class DecimalCoordinatesToCartesianConverter : IValueConverter { public object Convert(object value, Type ta

我有控制权

首先,我有十进制类型的坐标

在第二个选项卡项中,我有DMS类型的坐标

当用户更改其中一项时,我希望此更改将影响第二种类型

现在,只有当我运行笛卡尔坐标的应用程序控件时,它才起作用。但是,当我在十进制坐标系中运行后更改某些内容时,笛卡尔坐标系的控件中没有任何更改

class DecimalCoordinatesToCartesianConverter : IValueConverter
    {
 public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
            {
                return null;
            }
            else
            {

                DecimalCoordinates decimalCoorinates = (DecimalCoordinates)value;

                CartesianCoorinates cartesianCoorinates = new CartesianCoorinates();

                // Set flag if number is negative
                cartesianCoorinates.LatitudeDirection = (decimalCoorinates.Latitude < (decimal)0d) ? GeoDirectionLatitude.S : GeoDirectionLatitude.N;

                // Work with a positive number
                decimalCoorinates.Latitude = Math.Abs(decimalCoorinates.Latitude);

                // Get d/m/s components
                decimal tempLatitudeDegress = Math.Floor(rdecimalCoorinates.Latitude);
               decimalCoorinates.Latitude -= tempLatitudeDegress;
               decimalCoorinates.Latitude *= 60;
                decimal tempLatitudeMinutes = Math.Floor(decimalCoorinates.Latitude);
                decimalCoorinates.Latitude -= tempLatitudeMinutes;
                decimalCoorinates.Latitude *= 60;
                decimal tempLatitudeSeconds = Math.Round(decimalCoorinates.Latitude);

                // Create padding character
                char padLatitude;
                char.TryParse("0", out padLatitude);


                cartesianCoorinates.LatitudeHours = (int)tempLatitudeDegress;
                cartesianCoorinates.LatitudeMinutes = System.Convert.ToInt32(tempLatitudeMinutes.ToString().PadLeft(2, padLatitude));
                cartesianCoorinates.LatitudeSeconds = System.Convert.ToInt32(tempLatitudeSeconds.ToString().PadLeft(2, padLatitude));


                cartesianCoorinates.LongitudeDirection = (decimalCoorinates.Longitude < (decimal) 0d)
                                                                     ? GeoDirectionLongtitude.W
                                                                     : GeoDirectionLongtitude.E;

                // Work with a positive number
                decimalCoorinates.Longitude = Math.Abs(decimalCoorinates.Longitude);

                // Get d/m/s compon## Heading ##ents
                decimal tempLongitudeDegress = Math.Floor(decimalCoorinates.Longitude);
                decimalCoorinates.Longitude -= tempLongitudeDegress;
                decimalCoorinates.Longitude *= 60;
                decimal tempLongitudeMinutes = Math.Floor(decimalCoorinates.Longitude);
                decimalCoorinates.Longitude -= tempLongitudeMinutes;
                decimalCoorinates.Longitude *= 60;
                decimal tempLongitudeSeconds = Math.Round(decimalCoorinates.Longitude);

                // Create padding character
                char padLongitude;
                char.TryParse("0", out padLongitude);


                cartesianCoorinates.LongitudeHours = (int)tempLongitudeDegress;
               cartesianCoorinates.LongitudeMinutes = System.Convert.ToInt32(tempLongitudeMinutes.ToString().PadLeft(2, padLongitude));
                cartesianCoorinates.LongitudeSeconds = System.Convert.ToInt32(tempLongitudeSeconds.ToString().PadLeft(2, padLongitude));



                return cartesianCoorinates;



            }
        }


        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return parameter;
        }
}


public class HotelDescriptionModelView
    {
        HotelDescription hotelDescription { get; set; }

        public HotelDescriptionModelView()
        {
            hotelDescription = new HotelDescription();

            hotelDescription.DecimalCoordinates = new DecimalCoordinates() { Latitude = (decimal)-89.67, Longitude = (decimal)-89.67 };
        }
        public DecimalCoordinates DecimalCoordinates
        {
            get
            {
                return this.hotelDescription.DecimalCoordinates;
            }
            set
            {
                this.hotelDescription.DecimalCoordinates = value;
            }
        }

        public CartesianCoordinates CartesianCoordinates
        {
            get
            {
                return this._hotelDescription.CartesianCoordinates;
            }
            set
            {
                this._hotelDescription.CartesianCoordinates = value;
            }
        }

    }


  public class CartesianCoordinates
    {
        public int LatitudeHours { get; set;}
        public int LatitudeMinutes { get; set; }
        public int LatitudeSeconds { get; set; }
        public GeoDirectionLongtitude LongitudeDirection { get; set; }

        public int LongitudeHours { get; set; }
        public int LongitudeMinutes { get; set; }
        public int LongitudeSeconds { get; set; }
        public GeoDirectionLatitude LatitudeDirection { get; set; }
    }

public class DecimalCoordinates
    {
        public decimal Latitude { get; set; }
        public decimal Longitude { get; set; }
    }

public enum GeoDirectionLongtitude
    {
        W=0,
        E=1
    }

public enum GeoDirectionLatitude
    {
        N=0,
        S=1
    }
class DecimalCoordinates Cartesian转换器:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
如果(值==null)
{
返回null;
}
其他的
{
小数点坐标小数点坐标=(小数点坐标)值;
cartesiancorinates cartesiancorinates=新的cartesiancorinates();
//如果数字为负数,则设置标志
CartesianCorinates.LatitudeDirection=(十进制坐标系.纬度<(十进制)0d)?地理方向纬度.S:地理方向纬度.N;
//用正数工作
decimalCoorinates.Latitude=Math.Abs(decimalCoorinates.Latitude);
//获取d/m/s组件
decimal TemplatedGress=数学楼层(RDecimalColorinates.纬度);
小数位数。纬度-=模板梯度;
小数位数。纬度*=60;
十进制模板数=数学层(十进制坐标系、纬度);
纬度-=模板数;
小数位数。纬度*=60;
DecimalTemplatudeSeconds=数学四舍五入(十进制坐标系、纬度);
//创建填充字符
纬度;
字符TryParse(“0”,外纬度);
cartesiancorinates.LatitudeHours=(int)templatiudedegress;
cartesiancorinates.LatitudeMinutes=System.Convert.ToInt32(tempLatitudeMinutes.ToString().PadLeft(2,padLatitude));
cartesiancorinates.LatitudeSeconds=System.Convert.ToInt32(tempLatitudeSeconds.ToString().PadLeft(2,padLatitude));
cartesiancorinates.LongitudeDirection=(十进制坐标系.经度<(十进制)0d)
?地球方向长震级.W
:大地方向长震级E;
//用正数工作
decimalCoorinates.Longitude=Math.Abs(decimalCoorinates.Longitude);
//获取d/m/s组件标题
十进制模板度=数学地板(十进制坐标经度);
小数位数。经度-=模板度度;
小数点坐标经度*=60;
十进制模板长度分钟=数学地板(十进制坐标经度);
小数位数。经度-=分钟;
小数点坐标经度*=60;
decimal TemplongTences=数学.Round(十进制坐标系.经度);
//创建填充字符
经度;
字符TryParse(“0”,超出经度);
cartesiancorinates.LongitudeHours=(int)模板度;
cartesiancorinates.LongitudeMinutes=System.Convert.ToInt32(tempLongitudeMinutes.ToString().PadLeft(2,padLongitudeMinutes));
cartesiancorinates.LongitudeSeconds=System.Convert.ToInt32(tempLongitudeSeconds.ToString().PadLeft(2,padLongitudeseconds));
返回cartesianCoorinates;
}
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
返回参数;
}
}
公共类HotelDescriptionModelView
{
HotelDescription HotelDescription{get;set;}
公共HotelDescriptionModelView()
{
hotelDescription=新的hotelDescription();
hotelDescription.DecimalCoordinates=新的小数坐标(){纬度=(十进制)-89.67,经度=(十进制)-89.67};
}
公共小数坐标
{
得到
{
返回this.hotelDescription.DecimalCoordinates;
}
设置
{
this.hotelDescription.DecimalCoordinates=值;
}
}
公共笛卡尔坐标笛卡尔坐标
{
得到
{
返回此。_hotelDescription.CartesianCoordinates;
}
设置
{
此._hotelDescription.CartesianCoordinates=值;
}
}
}
公共类卡特尔坐标
{
公共int-LatitudeHours{get;set;}
公共int-LatitudeMinutes{get;set;}
公共int-LatitudeSeconds{get;set;}
公共大地方向纵向方向{get;set;}
公共int LongitudeHours{get;set;}
public int LongitudeMinutes{get;set;}
public int LongitudeSeconds{get;set;}
公共地理方向纬度纬度方向{get;set;}
}
公共类小数坐标
{
公共十进制纬度{get;set;}
公共十进制经度{get;set;}
}
公共枚举大地方向长度
{
W=0,
E=1
}
公共枚举地理方向纬度
{
N=0,
S=1
}

您需要在类中实现INotifyPropertyChanged,并在属性更改时触发事件。否则WPF不知道值是不同的