Вот рабочий раствор 3-свойство ViewModel, если вы используете TimeSpan
и его диапазон составляет от 0 до 59ч 59с. Я не полностью протестировал, и условия/валидация будут меняться в зависимости от требований. Я использовал TimeSpan.TotalSeconds
, потому что это необходимое нам разрешение; значение, при установке TimeSpan
на новое значение, мы просто установили общее количество секунд через публичное свойство. Альтернативой может быть наличие 2 TimeSpan
свойств в вашей модели ViewModel, а затем при настройке общедоступной собственности вы можете позвонить _item.TotalSeconds = VMMinutes.TotalSeconds + VMSeconds.TotalSeconds.TotalSeconds
. В принципе у вас есть много вариантов дизайна здесь.
MainWindow.xaml:
MainWindow.xaml.cs:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ItemViewModel(new Item(new TimeSpan(0, 3, 59)));
}
}
ItemViewModel.cs:
public class ItemViewModel : INotifyPropertyChanged
{
private readonly Item _item;
public event PropertyChangedEventHandler PropertyChanged;
public ItemViewModel(Item item)
{
_item = item;
}
public string TotalSeconds
{
get
{
return _item.TotalSeconds.ToString();
}
set
{
double newTotSecs;
if(!string.IsNullOrEmpty(value))
{
if(double.TryParse(value, out newTotSecs))
{
_item.TotalSeconds = newTotSecs;
NotifyPropertyChanged();
NotifyPropertyChanged("Minutes");
NotifyPropertyChanged("Seconds");
}
}
}
}
public string Seconds
{
get
{
return (_item.TotalSeconds % 60).ToString();
}
set
{
int newVal;
if(!string.IsNullOrEmpty(value))
{
if(int.TryParse(value, out newVal))
{
if(newVal >= 0 && newVal <= 59)
{
int totMinSec;
if(int.TryParse(Minutes, out totMinSec))
{
_item.TotalSeconds = (totMinSec * 60) + newVal;
NotifyPropertyChanged();
NotifyPropertyChanged("TotalSeconds");
}
}
}
}
}
}
public string Minutes
{
get
{
return ((int)(_item.TotalSeconds/60)).ToString();
}
set
{
int newVal;
if(!string.IsNullOrEmpty(value))
{
if(int.TryParse(value, out newVal))
{
if(newVal >= 0 && newVal <= 59)
{
int totSec;
if(int.TryParse(Seconds, out totSec))
{
_item.TotalSeconds = totSec + (newVal * 60);
NotifyPropertyChanged();
NotifyPropertyChanged("TotalSeconds");
}
}
}
}
}
}
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Item.cs:
public class Item
{
private TimeSpan _time;
public double TotalSeconds
{
get
{
return _time.TotalSeconds;
}
set
{
if(value >= 0)
{
_time = new TimeSpan(0, 0, (int)value);
}
}
}
public Item(TimeSpan time)
{
_time = time;
}
}
Примечание: Другой вариант заключается в использовании Converter
, который я не предоставил решение. Я думаю, что в конечном итоге это может стать более чистым, так как все, что вам действительно нужно переходить взад и вперед, это конвертер, общее количество секунд.
Самый чистый способ, о котором я могу думать, состоит в том, чтобы просто иметь еще два свойства на виртуальной машине, и в их сеттерах соответствующим образом отрегулировать окончательную строку времени. Вы уверены, что не можете добавить какие-либо свойства в виртуальную машину? – user3690202
Вы можете использовать два преобразователя: один, который принимает исходную строку и выводит миллиметр, а другой - выводит ss. Но, как упоминалось выше, есть 2 свойства чище. –
Отлично, спасибо :) – kamilw