0

當我使用以下行時,從Silverlight類庫實現模板控件;設置XAML屬性在運行時會被覆蓋嗎?

<labelSliderControl:SliderControl x:Name="sldX" Label="X" Value="4" />

我在VS Disign看查看滑塊獲得的4值但是,當我運行應用程序的滑塊從0開始。所以,當我更改屬性在XAML我可以看到的變化,但我也希望在課程的運行時間的值爲4。在這種情況下,depency屬性是否覆蓋了值?

這是Silverlight類庫中的模板控件;

<Style TargetType="local:SliderControl"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="local:SliderControl"> 
       <Grid x:Name="LayoutRoot" Background="White"> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto" /> 
         <RowDefinition /> 
         <RowDefinition Height="Auto" /> 
        </Grid.RowDefinitions> 
        <sdk:Label x:Name="lblLabel" Content="" HorizontalContentAlignment="Center" /> 
        <Slider x:Name="sldValue" Grid.Row="1" Orientation="Vertical" /> 
        <TextBox x:Name="txtValue" Grid.Row="2" MaxWidth="50" MinWidth="50" Text="{Binding ElementName=sldValue, Path=Value, StringFormat=\{0:N2\}}" /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

[TemplatePart(Name = "sldValue", Type = typeof(Slider)), TemplatePart(Name = "lblLabel", Type = typeof(Label))] 
public class SliderControl : Control 
{ 
    private Slider _sliderElement; 

    private Slider SliderElement 
    { 
     get { return _sliderElement; } 
     set { 
      if (_sliderElement != null) 
       _sliderElement.ValueChanged -= new RoutedPropertyChangedEventHandler<double>(sldValue_ValueChanged);; 

      _sliderElement = value; 

      if (_sliderElement != null) 
       _sliderElement.ValueChanged += new RoutedPropertyChangedEventHandler<double>(sldValue_ValueChanged); 
     } 
    } 

    public event EventHandler<ValueChangingEventArgs> ValueChanging; 

    public static readonly DependencyProperty ValueProperty = 
     DependencyProperty.Register("Value", typeof(double), typeof(SliderControl), new PropertyMetadata(0.0, ValuePropertyChanged)); 

    private static void ValuePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
    { 
     if (obj is SliderControl) 
     { 
      SliderControl sliderUserControl = (SliderControl)obj; 
      if (sliderUserControl.SliderElement != null) 
      { 
       sliderUserControl.SliderElement.Value = (double)args.NewValue; 
      } 
     } 
    } 

    public SliderControl() 
    { 
     this.DefaultStyleKey = typeof(SliderControl); 
    } 

    private void sldValue_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
    { 
     if (ValueChanging != null) 
     { 
      ValueChanging(this, new ValueChangingEventArgs(e.OldValue, e.NewValue)); 
     } 
    } 

    public override void OnApplyTemplate() 
    { 
     SliderElement = GetTemplateChild("sldValue") as Slider; 
     base.OnApplyTemplate(); 
    } 
} 

回答

0

我在註冊DependencyProperty時看不到「Value」屬性。

public double Value 
{ 
    get { return (double)base.GetValue(ValueProperty); } 
    set { base.SetValue(ValueProperty, value); } 
} 

,然後將屬性綁定到控制在構造函數中:

public SliderControl(){ 

    InitializeComponent(); 

    this.sldValue.SetBinding(Slider.ValueProperty, new Binding() 
    { 
     Source = this, 
     Path = new PropertyPath("Value"), 
     Mode = BindingMode.TwoWay 
    }); 
} 
+0

感謝您的快速回復。 – Magiel 2010-09-24 22:42:42

+0

感謝您的快速回復。註冊DependencyProperty時聲明的「Value」屬性被錯誤地發佈。我很抱歉。 我嘗試了你有趣的解決方案,但我正在嘗試使用模板控件。我假設因爲OnApplyTemplate 尚未被調用,我沒有在我的模板控件中將Slider作爲Child控件的引用集。使用附加屬性是否是一個想法,或者我正在考慮從silder繼承整個模板化控件並傳遞所有屬性。我認爲必須有更好的解決方案。 – Magiel 2010-09-24 22:54:57

0

我得到它的工作!我只是把gmcalab的解決方案放在OnApplyTemplate中。 感謝gmcalab。

public override void OnApplyTemplate() 
    { 
     SliderElement = GetTemplateChild("sldValue") as Slider; 
     if (SliderElement != null) 
     { 
      SliderElement.SetBinding(Slider.ValueProperty, new Binding() 
      { 
       Source = this, 
       Path = new PropertyPath("Value"), 
       Mode = BindingMode.TwoWay 
      }); 
     } 
     base.OnApplyTemplate(); 
    }