Note that there are some explanatory texts on larger screens.

plurals
  1. POMake standard property update along with DependencyProperty
    text
    copied!<p>I may be completely off on this, but I swear I remember reading somewhere how to do this, I just can't seem to find it. I have a DependencyProperty <code>Minutes</code> as part of a TimePicker custom control. It's data type is <code>int</code>, as it was the only way to get the increase/decrease button to work. The problem with this is that the minutes from 1-9 display without the leading zero. To circumvent this, I added a standard property <code>MinuteZeros</code>, which converts the value of <code>Minutes</code> to a <code>string</code> and employs <code>ToString("00")</code>. This property is bound to the display content. Now when I hit the increase/decrease buttons though, it doesn't update. How do I bind <code>Minutes</code> and <code>MinuteZeros</code> so that they update each other automatically?</p> <p><strong>Code:</strong></p> <pre><code>public class TimePicker : Control { public static DependencyProperty HourProperty = DependencyProperty.Register("Hour", typeof(int), typeof(TimePicker), new FrameworkPropertyMetadata((int)12, new PropertyChangedCallback(OnHourChanged))); public static DependencyProperty MinuteProperty = DependencyProperty.Register("Minute", typeof(int), typeof(TimePicker), new FrameworkPropertyMetadata((int)00, new PropertyChangedCallback(OnMinuteChanged))); public int Hour { get { return (int)GetValue(HourProperty); } set { SetValue(HourProperty, value); } } public string MinuteZeros { get { return Minute.ToString("00"); } set { value = Minute.ToString("00"); } } public int Minute { get { return (int)GetValue(MinuteProperty); } set { SetValue(MinuteProperty, value); } } #endregion #region Events public override void OnApplyTemplate() { var upButton = GetTemplateChild("PART_IncreaseTime") as RepeatButton; upButton.Click += IncreaseClick; var downButton = GetTemplateChild("PART_DecreaseTime") as RepeatButton; downButton.Click += DecreaseClick; var hourButton = GetTemplateChild("PART_Hour") as ToggleButton; hourButton.Checked += HourSelected; var minuteButton = GetTemplateChild("PART_Minute") as ToggleButton; minuteButton.Checked += MinuteSelected; } private void HourSelected(object sender, RoutedEventArgs e) { var minuteButton = GetTemplateChild("PART_Minute") as ToggleButton; minuteButton.IsChecked = false; } private void MinuteSelected(object sender, RoutedEventArgs e) { var hourButton = GetTemplateChild("PART_Hour") as ToggleButton; hourButton.IsChecked = false; } private void IncreaseClick(object sender, RoutedEventArgs e) { var hourButton = GetTemplateChild("PART_Hour") as ToggleButton; var minuteButton = GetTemplateChild("PART_Minute") as ToggleButton; if (hourButton.IsChecked == true) { if (Hour == 12) { Hour = 1; } else { Hour += 1; } } else if (minuteButton.IsChecked == true) { if (Minute == 59) { Minute = 00; } else { Minute += 1; } } } private void DecreaseClick(object sender, RoutedEventArgs e) { var hourButton = GetTemplateChild("PART_Hour") as ToggleButton; var minuteButton = GetTemplateChild("PART_Minute") as ToggleButton; if (hourButton.IsChecked == true) { if (Hour == 1) { Hour = 12; } else { Hour -= 1; } } else if (minuteButton.IsChecked == true) { if (Minute == 00) { Minute = 59; } else { Minute -= 1; } } } private static void OnHourChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { } private static void OnMinuteChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { } static TimePicker() { DefaultStyleKeyProperty.OverrideMetadata(typeof(TimePicker), new FrameworkPropertyMetadata(typeof(TimePicker))); } } public partial class TimePickerEvents : ResourceDictionary { TimePicker time = new TimePicker(); void PART_IncreaseTime_Click(object sender, RoutedEventArgs e) { time.Hour += 1; } } </code></pre> <p><strong>XAML</strong>:</p> <pre><code>&lt;ToggleButton x:Name="PART_Minute" VerticalAlignment="{TemplateBinding VerticalAlignment}" Margin="0" MinWidth="25" BorderBrush="Transparent" Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=MinuteZeros}"&gt; &lt;ToggleButton.Template&gt; &lt;ControlTemplate TargetType="{x:Type ToggleButton}"&gt; &lt;Grid&gt; &lt;ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/&gt; &lt;ContentPresenter x:Name="ContentPart" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" TextBlock.Foreground="#FF605c" Visibility="Collapsed"&gt; &lt;ContentPresenter.Effect&gt; &lt;BlurEffect /&gt; &lt;/ContentPresenter.Effect&gt; &lt;/ContentPresenter&gt; &lt;/Grid&gt; &lt;ControlTemplate.Triggers&gt; &lt;Trigger Property="IsMouseOver" Value="True"&gt; &lt;Setter TargetName="ContentPart" Property="Visibility" Value="Visible" /&gt; &lt;/Trigger&gt; &lt;Trigger Property="IsChecked" Value="True"&gt; &lt;Setter Property="FontWeight" Value="Bold" /&gt; &lt;Setter TargetName="ContentPart" Property="Visibility" Value="Visible" /&gt; &lt;/Trigger&gt; &lt;/ControlTemplate.Triggers&gt; &lt;/ControlTemplate&gt; &lt;/ToggleButton.Template&gt; &lt;ToggleButton.Style&gt; &lt;Style TargetType="{x:Type ToggleButton}"&gt; &lt;Setter Property="Background" Value="Transparent" /&gt; &lt;/Style&gt; &lt;/ToggleButton.Style&gt; &lt;/ToggleButton&gt; </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload