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