私はこの問題の解決策を見つけようとしてきましたが、インターネットで見つけた可能なアプローチにかなり混乱しています。
DateTime のスライダーを含む UserControl を作成しました。
<UserControl x:Name="root">
<Grid x:Name="gridPanel">
<Slider x:Name="slider" HorizontalAlignment="Left" VerticalAlignment="Top" Height="34" Width="479"
Minimum="{Binding ElementName=root, Path=Minimum, Converter={StaticResource ResourceKey=dateToDoubleConverter}}"
Maximum="{Binding ElementName=root, Path=Maximum, Converter={StaticResource ResourceKey=dateToDoubleConverter}}"
Value="{Binding ElementName=root, Path=Value, Converter={StaticResource ResourceKey=dateToDoubleConverter}}" />
<Label x:Name="lblStartTime" Content="{Binding ElementName=slider, Path=Minimum, Converter={StaticResource ResourceKey=doubleToStringConverter}}" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,73,0,0" FontSize="10"/>
<Label x:Name="lblStopTime" Content="{Binding ElementName=slider, Path=Maximum, Converter={StaticResource ResourceKey=doubleToStringConverter}}" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,73,10,0" FontSize="10"/>
</Grid>
</UserControl>
コードビハインド:
public SliderPanel() {
InitializeComponent();
gridPanel.DataContext = this;
}
#region Dependency Property - Minimum
public DateTime Minimum {
get { return (DateTime)GetValue(MinimumProperty); }
set { SetValue(MinimumProperty, value); }
}
public static readonly DependencyProperty MinimumProperty =
DependencyProperty.Register("Minimum", typeof(DateTime), typeof(SliderPanel), new UIPropertyMetadata(DateTime.Now));
#endregion
#region Dependency Property - Maximum
public DateTime Maximum {
get { return (DateTime)GetValue(MaximumProperty); }
set { SetValue(MaximumProperty, value); }
}
public static readonly DependencyProperty MaximumProperty =
DependencyProperty.Register("Maximum", typeof(DateTime), typeof(SliderPanel), new UIPropertyMetadata(DateTime.Now.AddDays(1)));
#endregion
#region Dependency Property - Value
public DateTime Value {
get { return (DateTime)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(DateTime), typeof(SliderPanel), new UIPropertyMetadata(DateTime.Now, new PropertyChangedCallback(OnValueChanged)));
public static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
SliderPanel sP = (SliderPanel)d;
if (e.Property == SliderPanel.ValueProperty) {
sP.slider.Value = ((DateTime)e.NewValue).Ticks;
}
}
#endregion
私のメイン ウィンドウでは、UserControl を使用し、次のようなコードを介していくつかのプロパティをバインドします。
System.Windows.Data.Binding bndPlayTime = new System.Windows.Data.Binding("CurrentPlayTime");
bndPlayTime.Source = controller;
bndPlayTime.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
lblCurPlayTime.SetBinding(System.Windows.Controls.TextBox.TextProperty, bndPlayString);
sliderPanel.SetBinding(SliderPanel.ValueProperty, bndPlayTime);
Controller クラスは INotifyPropertyChanged を実装します。
public DateTime CurrentPlayTime {
get {
return currentPlayTime;
}
set {
if (DateTime.Compare(currentPlayTime, value) != 0) {
currentPlayTime = value;
NotifyPropertyChanged("CurrentPlayTime");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName) {
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
CurrentPlayTime プロパティは、タイマーによって常に更新されます。次に、スライダーをそれに応じて移動させたいと思います。ラベルへのバインディングは機能します。ラベルは定期的に更新されます。ただし、UserControl の依存関係プロパティにバインドしても、スライダーの値は更新されません (コールバック メソッドを実装したにもかかわらず)。何か不足していますか?
私はWPFに非常に慣れていないので、ご容赦ください。よろしくお願いします。