简体   繁体   English

Silverlight中的强制不起作用

[英]Coercion in Silverlight does not work

I've a custom control look like this: 我有一个自定义控件,如下所示:

generic.xaml 泛型

<Style TargetType="controls:MyControl">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="controls:MyControl">
        <Grid>
          <Grid.RowDefinitions>
            <RowDefinition Height="20" />
            <RowDefinition Height="20" />
          </Grid.RowDefinitions>
          <TextBox Grid.Row="0"
                   Text="{Binding ElementName=slider, Path=Value}" />
          <Slider Grid.Row="1" Name="slider" Width="120"
                  Minimum="1" Maximum="12"
                  Value="{Binding Mode=TwoWay,
                          RelativeSource={RelativeSource TemplatedParent},
                          Path=Value}"/>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

MyControl.cs MyControl.cs

public static readonly DependencyProperty ValueProperty =
  DependencyProperty.Register("Value",
  typeof(double),
  typeof(MyControl),
  new PropertyMetadata(0d, OnValueChanged));

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

  private static void OnValueChanged(DependencyObject source,
                                     DependencyPropertyChangedEventArgs e)
  {
    MyControl myControl = (MyControl)source;
    myControl.OnValueChanged((double)e.OldValue, (double)e.NewValue);
  }

  protected virtual void OnValueChanged(double oldValue, double newValue)
  {
    double coercedValue = CoerceValue(newValue);
    if (coercedValue != newValue)
    {
      this.Value = coercedValue;
    }
  }

  private double CoerceValue(double value)
  {
    double limit = 7;
    if (value > limit)
    {
      return limit;
    }
    return value;
  }

The TextBox is just a dummy to show the value. TextBox只是显示值的虚拟对象。

Now when I add this control to an Application, I am able to set the Slider value greater than 7, although the value of my DependencyProperty is set to 7. 现在,当我将此控件添加到应用程序中时,尽管DependencyProperty的值设置为7,但我可以将Slider值设置为大于7。

What I am doing wrong? 我做错了什么? Does the TwoWayBinding does not work in this situation? 在这种情况下,TwoWayBinding是否不起作用?

Thanks in advance 提前致谢

Steps for my repro:- 我的复制步骤:-

  • Create a fresh new Silverlight Application in VS2010 call SilverlightApplication1. 在VS2010中创建一个新的名为SilverlightApplication1的新Silverlight应用程序。
  • Add new "Silverlight Templated Control" to the silverlight project, naming it "MyControl". 将新的“ Silverlight模板化控件”添加到silverlight项目,并将其命名为“ MyControl”。
  • Copied the inner contents or you ControlTemplate into the ControlTemplate of the themes/Generic.xaml file. 将内部内容或您的ControlTemplate复制到主题/Generic.xaml文件的ControlTemplate中。 This Entire generic file looks like:- 整个通用文件如下所示:-

     <Style TargetType="local:MyControl"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="local:MyControl"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="20" /> <RowDefinition Height="20" /> </Grid.RowDefinitions> <TextBox Grid.Row="0" Text="{Binding ElementName=slider, Path=Value}" /> <Slider Grid.Row="1" Name="slider" Width="120" Minimum="1" Maximum="12" Value="{Binding Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}, Path=Value}"/> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> 

    • Copied your C# placed in in MyControl.cs. 将您的C#复制到MyControl.cs中。 The whole file looks like:- 整个文件看起来像:

using System.Windows; 使用System.Windows; using System.Windows.Controls; 使用System.Windows.Controls;

namespace SilverlightApplication1
{
    public class MyControl : Control
    {
        public MyControl()
        {
            this.DefaultStyleKey = typeof(MyControl);
        }

        public static readonly DependencyProperty ValueProperty =
  DependencyProperty.Register("Value",
  typeof(double),
  typeof(MyControl),
  new PropertyMetadata(0d, OnValueChanged));

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

        private static void OnValueChanged(DependencyObject source,
                                           DependencyPropertyChangedEventArgs e)
        {
            MyControl myControl = (MyControl)source;
            myControl.OnValueChanged((double)e.OldValue, (double)e.NewValue);
        }

        protected virtual void OnValueChanged(double oldValue, double newValue)
        {
            double coercedValue = CoerceValue(newValue);
            if (coercedValue != newValue)
            {
                this.Value = coercedValue;
            }
        }

        private double CoerceValue(double value)
        {
            double limit = 7;
            if (value > limit)
            {
                return limit;
            }
            return value;
        }

    }
}
  • Added an instance of MyControl to MainPage.xaml, which now looks like:- 在MainPage.xaml中添加了MyControl的实例,该实例现在看起来像:

     <UserControl x:Class="SilverlightApplication1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:SilverlightApplication1" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <Grid x:Name="LayoutRoot" Background="White"> <local:MyControl /> </Grid> </UserControl> 
  • Run the solution, works fine. 运行解决方案,工作正常。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM