我已经浏览了大约30个不同的帖子,并且改变了我处理这个问题的方式,它越来越接近但仍然无法工作。
我在库中有一个自定义按钮控件,我在主应用程序中使用它。该按钮显示,处理鼠标悬停等,但文本的依赖属性(或图标,但后来我得到的)不会更新。当我设置Dependency属性时,默认值是它显示的唯一值,它不会显示我在设计器中设置的任何内容,也不会显示代码。
public static readonly DependencyProperty FileTextProperty;
//Constructor
static FileButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(FileButton), new FrameworkPropertyMetadata(typeof(FileButton)));
// Initialize dependency properties
FileTextProperty = DependencyProperty.Register("FileText", typeof(string), typeof(FileButton), new UIPropertyMetadata ("Default File Text"));
}
/// <summary>
/// The Filename text displayed by the button.
/// </summary>
[Description("The text displayed by the button."), Category("Common Properties")]
public string FileText
{
get { return (string)GetValue(FileTextProperty); }
set { SetValue(FileTextProperty, value); }
}
这里是XAML(Somewhat abbreviated)
<Style x:Key="ButtonFocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="GradientStyle" TargetType="{x:Type Button}">
<Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
<Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>
<Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:FileButton}">
<Grid x:Name="main" MinHeight="38" MaxHeight="38">
<Grid Margin="4,0" Name="DisplayMain">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock x:Name="fileText" HorizontalAlignment="Stretch" Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=local:FileButton, AncestorLevel=1}, Path=FileText}" TextWrapping="NoWrap" VerticalAlignment="Top" Grid.Column="0" Margin="4,0,0,0" TextTrimming="WordEllipsis"/>
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ControlTemplate.Resources>
<Grid x:Name="LayoutRoot" Margin="0">
<local:FileButton Style="{DynamicResource GradientStyle}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
当我运行它时,按钮上显示的唯一数据是默认文本。即使我知道我正在设置依赖属性。我甚至在XAML中使用绑定Path = FileText.Length以确保它到达它并且它是,并且它在按钮上显示0,所以看起来我没有设置数据,即使我手动创建按钮,并将其插入容器,它仍然不显示我设置它。 (是的,我在调试器中进入它以确保)
任何想法,一天中的大部分时间都试图解决这个问题。
请帮助!
答案 0 :(得分:0)
您无需为此创建自定义按钮。您可以将任何内容放在Button中:
<Grid x:Name="LayoutRoot">
<Button VerticalAlignment="Top" Margin="132,140,168,0" Height="54.96">
<StackPanel>
<Image Source="{Binding Icon}"></Image>
<TextBlock Text="{Binding FileName}" HorizontalAlignment="Left"/>
</StackPanel>
</Button>
</Grid>
其中FileName是您创建的viewmodel中的属性,您将其设置为Window(或网格或按钮)的DataContext。
使用此MVVM设置,当您在代码中更改FileName时,它会自动将其显示在您的按钮中。
您仍然可以按照自己的方式设置按钮的样式。
答案 1 :(得分:0)
我不确定你为什么使用RelativeSource绑定而不是TemplateBinding
如果其他一切都一样,我会这样做
<TextBlock Text="{TemplateBinding FileText}" />