【问题标题】:WPF Dependency Properties Settings binding doesnt updateWPF 依赖属性设置绑定不更新
【发布时间】:2012-02-16 00:50:59
【问题描述】:

我已经浏览了大约 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(有点缩写)

                    <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,所以看起来我没有设置数据,即使我手动创建按钮,并将其插入容器中,它仍然不显示我设置的内容。 (是的,我在调试器中进入它以确保)

任何想法,大部分时间都在试图解决这个问题。

请帮忙,谢谢!

【问题讨论】:

    标签: wpf button binding dependency-properties


    【解决方案1】:

    您无需为此创建自定义按钮。您可以将任何您想要的内容放入 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 是您创建的视图模型中的一个属性,您将其设置为窗口(或网格或按钮)的 DataContext。

    使用此MVVM 设置,当您在代码中更改 FileName 时,它​​将自动显示在您的按钮中。

    您仍然可以根据需要为按钮设置任何样式。

    【讨论】:

    • 嗯,实际上不仅仅是文本,这就是我创建自定义按钮的原因,我还有很多事情要做,我省略了,只是因为它与这个问题无关。我会尝试这种方式,看看我是否仍然可以包含其他所有内容。
    • 您可以在按钮中添加更多内容,而不仅仅是文本 :) 您可以在其中添加任何内容,从文本和图像到列表框和网格。
    【解决方案2】:

    我不确定您为什么使用 RelativeSource 绑定而不是 TemplateBinding

    在其他都一样的情况下,我会这样做

    <TextBlock Text="{TemplateBinding FileText}" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-26
      • 2012-11-08
      • 1970-01-01
      • 2014-08-31
      • 2023-03-26
      • 2011-12-18
      • 2011-03-05
      • 1970-01-01
      相关资源
      最近更新 更多