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">
如果你想绑定到你自己的"自己"依赖属性,UserControl你需要添加一个x:Name你的UserControl并ElementName在你的绑定中使用它.
<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)
| 归档时间: |
|
| 查看次数: |
1828 次 |
| 最近记录: |