Как отобразить таймер в текстовом поле?
Привет,
Я новичок в C#, у меня мало сомнений относительно MVVM. Когда использовать IVauleConverter и концепцию привязки? Чтобы понять концепцию, я написал небольшой демо-проект.
На самом деле я пытаюсь реализовать небольшой проект ,где у меня есть имя,фамилия, полное имя, таймер и Эллипс.Текстовое поле таймера должно отображать время, когда возникает событие обработчика времени, и цвет эллипса должен измениться. Я хочу написать код для пользовательского интерфейса отдельно, и логика должна быть другой.В приведенном ниже коде он не отображает время в текстовом поле таймера.
Что я уже пробовал:
private DispatcherTimer atimer; public Person personobj { get; set; } public MainWindow() { InitializeComponent(); personobj = new Person(); personobj.firstName = "hello"; personobj.lastName= ""; this.DataContext = personobj; // aTimer = new System.Timers.Timer(2000); // aTimer.Elapsed += new ElapsedEventHandler(OnTimeEvent); // aTimer.Enabled = true; // atimer = new DispatcherTimer(); // atimer.Interval = TimeSpan.FromMilliseconds(5000); //atimer.Tick += new EventHandler(OnTimeEvent); //atimer.Start(); } /*private void OnTimeEvent(object sender, EventArgs e) { //TimerCount.Text = DateTime.Now.ToString("hh:mm:ss"); // throw new NotImplementedException(); }*/ } public class Person : INotifyPropertyChanged { /// <summary> /// /// public String firstName; public String lastName; public String fullName=""; private Boolean colorchange=false; private String timeIndicator; private DispatcherTimer timeCount; public Person() { timeCount = new DispatcherTimer(); timeCount.Tick += new EventHandler(Timer_Tick); timeCount.Interval = TimeSpan.FromMilliseconds(5000); timeCount.Start(); } public String FirstName { get { return firstName; } set { if (firstName != value) { firstName = value; OnPropertyChanged("FirstName"); OnPropertyChanged("FullName"); } } } public String LastName { get { return lastName; } set { if (lastName != value) { lastName = value; OnPropertyChanged("LastName"); OnPropertyChanged("FullName"); } } } public String FullName { get { // Debug.WriteLine(fullName); return this.fullName = firstName + " " + lastName; } set { this.fullName = value; OnPropertyChanged("FullName"); /*if (fullName != "") { colorchange = false; } else { colorchange = true; }*/ } } public Boolean Colorchange { get { return colorchange; } set { colorchange = value; OnPropertyChanged("Colorchange"); } } public string TimeIndicator { get { return timeIndicator; } set { timeIndicator = value; if (timeIndicator != null) { colorchange = true; } else { colorchange = false; } OnPropertyChanged("TimeIndicator"); } } private void Timer_Tick(object sender, EventArgs e) { TimeIndicator = DateTime.UtcNow.ToString("hh:mm:ss"); // OnPropertyChanged("TimeIndicator"); } // public delegate PropertyChangedEventHandler(string property); public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string property) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(property)); // PropertyChanged(property); } } } // [ValueConversion(typeof(Person), typeof(Brush))] public class ColorChange : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { // Boolean BooleanValue = (Boolean)value; if (value.ToString()!= null) { return value.ToString(); } else { return (object)Brushes.Green; } } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { if (value is bool) { if ((bool)value == true) return new SolidColorBrush(Colors.Green); else return new SolidColorBrush(Colors.Red); } return null; } } }
<window.resources> <local:ColorChange x:Key="ColorChange"/> <grid> <TextBox Text="{Binding Path=FirstName, Mode=TwoWay}" Margin="145,20,187,264" /> <TextBox Text="{Binding Path=LastName, Mode=TwoWay}" Margin="145,75,187,209" /> <TextBox Name="fulltxtname" Text="{Binding Path=FullName, Mode=TwoWay}" Margin="145,125,187,159"/> <TextBox Name ="TimerCount" Text="{Binding Path=timeIndicator,Mode=TwoWay }" Margin="75,200,297,89"/> <Ellipse Fill="{Binding ElementName=TimerCount, Converter={StaticResource ColorChange}}" HorizontalAlignment="Left" Height="35" Margin="260,195,0,0" Stroke="Black" VerticalAlignment="Top" Width="40"/>
[no name]
Вероятно, потому, что вы привязываетесь к timeIndicator, но фактическое имя свойства-TimeIndicator. Те сообщения об ошибках привязки, которые вы видите в окне вывода, действительно пытаются Вам что-то сказать.
Member 13048543
Я исправил это, но я получаю en error ' DynamicValueConverter 'failed to convert value' System.Окна.Управления.TextBox'(Тип String).
[no name]
Это потому, что вы пытаетесь преобразовать систему.Окна.Управления.Управление текстовым полем в вашем конвертере точно так же, как вы ему сказали.
Member 13048543
Большое спасибо. Я добавил конвертер={StaticResource ColorChange} в текстовое поле таймера, после чего он показывает время.Но мое требование заключается в том, что всякий раз, когда возникает событие таймера, цвет эллипса должен меняться.Пожалуйста, не могли бы вы дать мне какое-нибудь предложение?
[no name]
Поэтому в вашем событии таймера измените цвет и уведомите пользовательский интерфейс о том, что произошло изменение. подсказка: именно это и делает OnNotifyPropertyChanged.
Member 13048543
Я ничего не понимал.Не могли бы вы объяснить немного подробнее?
[no name]
Ваш код должен делать это сейчас. Но я не запускаю ваш код, поэтому не вижу того, что вы видите на своем экране. Но ваше требование не имеет смысла. В соответствии с вашим кодом Colorchange всегда будет истинным на ТИКе времени, так что ваш цвет на самом деле не меняется.