WPF绑定新按钮模板的属性

时间:2013-08-03 18:06:05

标签: c# wpf templates button binding

好的,我已经为我想要在我的应用中使用的Buttons制作了新样式。一般的想法是有10个方格Button,其中我将有一个Image,并且在TextBlock之下。 我的问题是,我想为每个Image.Source设置TextBlock.TextButton不同。 我在做什么是这样的:

<ControlTemplate TargetType="{x:Type Button}">

<Border x:Name="Border" CornerRadius="5" BorderThickness="1" Background="Gray" BorderBrush="Orange">
   <Grid>
     <Grid.RowDefinitions>
       <RowDefinition Height="Auto"/>
       <RowDefinition Height="*"/>
     </Grid.RowDefinitions>
        <Image Margin="0,5,0,0" Grid.Row="0" Width="25"  Height="25" VerticalAlignment="Center" HorizontalAlignment="Center"/>
     <TextBlock FontSize="12"/>
   </Grid>
</Border>

为了充分利用我的风格,我该怎么做?

<Button Style="{DynamicResource MenuButtons}" Text="????" x:Name="LiveB" Source="????" Click="Live_Click"/>

提前致谢。

2 个答案:

答案 0 :(得分:2)

如果所有你需要的是一张图片和一些文字,你可以使用按钮.Tag.Content使其工作(误):

<Style x:Key="MenuButtons" ...

    ...
    <ControlTemplate TargetType="{x:Type Button}" >
        <Border x:Name="Border" CornerRadius="5" BorderThickness="1" Background="Gray" BorderBrush="Orange">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Image Width="25"  Height="25" VerticalAlignment="Center" HorizontalAlignment="Center"
                       Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}" />
                <TextBlock FontSize="12" Text="{TemplateBinding Content}" Grid.Row="1" />
            </Grid>
        </Border>
    </ControlTemplate>
    ...

..然后:

<Button Style="{DynamicResource MenuButtons}" x:Name="LiveB" 
        Content="MyText la la la..." Tag="http://programming.enthuses.me/1.png" 
        Click="Live_Click" />

如果您需要更多自定义内容,则需要查看Konstantin Zhukov的评论和Attached Properties

(为什么你不能只使用"{TemplateBinding Tag}"代替"...{RelativeSource TemplatedParent}..."?我不知道,但TemplateBinding通常是一个非常脆弱的捷径并不总是做它应该做的......)

答案 1 :(得分:1)

你需要做的是创建一个类,它将作为按钮

的DataContext
Class ButtonDataContext
{
    public String TextBlockText {get;set;}
    public String ImageSource {get;set;}
}

然后做

LiveB.DataContext = new ButtonDataContext(){TextBlockText = "text", ImageSource = "Image Path"};

在控制模板XAML

<Image Source="{Binding Path=ImageSource}" Margin="0,5,0,0" Grid.Row="0" Width="25"  Height="25" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding Path=TextBlockText}" FontSize="12"/>