UserControl中的绑定不起作用(模板绑定到自定义依赖项属性)

zya*_*ash 3 silverlight xaml windows-phone-7

我有一个用户控件,我想这样使用:

// MainPage.xaml
<my:MyControl Data="10" />
<!-- or -->
<my:MyControl Data="{Binding SomeData}" />
Run Code Online (Sandbox Code Playgroud)

这是代码绑定:

 public partial class MyControl : UserControl
 {
    public MyControl() {
       InitializeComponent();
    }
   public const string DataPropertyName = "Data";
   public int Data
        {
            get
            {
                return (int)GetValue(DataProperty);
            }
            set
            {
                SetValue(DataProperty, value);
            }
        }

        public static readonly DependencyProperty DataProperty = DependencyProperty.Register(
            DataPropertyName,
            typeof(int),
            typeof(MyControl),
            new PropertyMetadata(10);
 }
Run Code Online (Sandbox Code Playgroud)

它的xaml部分是这样的:

 <UserControl>
    <!-- omitted namespaces etc. -->
    <Grid x:Name="LayoutRoot">
         <Button x:Name="myButton" Content="{Binding Data}">
           <Button.Style>
             <Setter Property="Template">
               <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <TextBlock Text="{TemplateBinding Content}" />
                 </ControlTemplate>
                 </Setter.Value>
            </Button.Style>
         </Button>
    </Grid>
   </UserControl>
Run Code Online (Sandbox Code Playgroud)

在usercontrol的xaml部分中,关键的一行是:

<Button x:Name="myButton" Content="{Binding Data}"> 
Run Code Online (Sandbox Code Playgroud)

我想将这个Button的Content属性绑定到UserControl的属性(Data),同时仍保留从外部设置值的能力(<my:MyControl Data="10" />)

问题是,当我使用绑定 - <Button x:Name="myButton" Content="{Binding Data}">- 它不起作用(模板绑定不会选择任何值)然而,如果我手动设置值,它仍然有效 -<Button x:Name="myButton" Content="12">

nem*_*esv 6

如果你想绑定到你自己的"自己"依赖属性,UserControl你需要添加一个x:Name你的UserControlElementName在你的绑定中使用它.

<UserControl x:Name="myControl">
    <!-- omitted namespaces etc. -->
    <Grid x:Name="LayoutRoot">
         <Button x:Name="myButton" 
                 Content="{Binding Data, ElementName=myControl}">        
         </Button>
    </Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

为了使它Template也工作:

而不是TemplateBinding你需要使用RelativeSource TemplatedParentsysntax,因为你需要设置Mode=OneWay(TemplateBinding Mode=OneTime默认情况下会出于性能原因而在你的场景中使用Mode=OneWay)

<Style TargetType="Button">
    <Style.Setters>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <TextBlock Text="{Binding Path=Content, Mode=OneWay, 
                        RelativeSource={RelativeSource TemplatedParent}}" />
                </ControlTemplate>    
            </Setter.Value>
        </Setter>
    </Style.Setters>
</Style>
Run Code Online (Sandbox Code Playgroud)