Dependency property is not updating the view

Viewed 63

I have an ItemsControl that is binding to an ObservableCollection "MenuButtons". In the ItemsControl, I want to add some Buttons programmatically with Dependency Properties.

My problem is that the values I pass are not updated. The default values are displayed in the view.

C#

  private void btnTest_Click(object sender, RoutedEventArgs e)
    {
        var vm = DataContext as UflMainWindowViewModel;
        vm.MenuButtons.Add(new UflMenuButton { IconText="Test123", Style = (Style)Application.Current.Resources["UflMenuButtonStyle"] });
    }

C# UflButtonClass

public class UflMenuButton : Button
{
    public string IconText
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("IconText", typeof(string), typeof(UflMenuButton), new UIPropertyMetadata("default", new PropertyChangedCallback(IconTextChanged)));

    private static void IconTextChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        UflMenuButton button = (UflMenuButton)sender;
        button.IconText = (string)e.NewValue;
    }
}

with the following Style:

WPF

<Style x:Key="UflMenuButtonStyle" TargetType="{x:Type local:UflMenuButton}">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding Path=(local:UflMenuButton.IconText),RelativeSource={RelativeSource TemplatedParent}}" HorizontalAlignment="Center"/>
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>
1 Answers

You can bind to the first ancestor of type UflMenuButton :

<TextBlock Text="{Binding IconText, RelativeSource={RelativeSource AncestorType={x:Type local:UflMenuButton}}}" HorizontalAlignment="Center"/>

This work, but I assume a more elegant way exists.

Related