Привязка настроек свойств зависимостей WPF не обновляется - PullRequest
0 голосов
/ 16 февраля 2012

Я уже просмотрел около 30 различных постов и изменил то, как я справляюсь с этим, и это становится ближе, но все равно не работает.

У меня есть элемент управления Custom Button в библиотеке, который я использую в главном приложении. Кнопка отображает, обрабатывает наведение мыши и тому подобное, но свойство зависимости для текста (или Icon, но я доберусь до этого позже) не будет обновляться. Когда я устанавливаю для свойства 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>

Когда я запускаю его, единственными данными, отображаемыми на кнопке, является текст по умолчанию. Несмотря на то, что я знаю, я устанавливаю свойство зависимости. Я даже когда использую привязку Path = FileText.Length в XAML, чтобы удостовериться, что он достигает его и он есть, и он отображает 0 на кнопке, так что кажется, что я не устанавливаю данные, даже когда я вручную создаю кнопку, и вставьте его в контейнер, он по-прежнему не отображает то, что я установил. (Да, я вошел в него в отладчике, чтобы убедиться)

Любые идеи, большую часть дня пытались выяснить это.

ПОЖАЛУЙСТА, ПОМОГИТЕ СПАСИБО!

Ответы [ 2 ]

0 голосов
/ 16 февраля 2012

Я не уверен, почему вы используете привязку RelativeSource вместо TemplateBinding

Со всем тем же, я бы сделал это

<TextBlock Text="{TemplateBinding FileText}" />
0 голосов
/ 16 февраля 2012

Вам не нужно создавать пользовательскую кнопку для этого. Вы можете поместить любой желаемый контент в кнопку:

<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 в своем коде, он будет автоматически отображаться в вашей кнопке.

Вы все еще можете стилизовать кнопку так, как хотите.

...