Dependency Property nie zmienia wartości

0

Hej wszystkim, mam problem z Dependency Property:
mam sobie kontrolkę. Dla Canvasa przypisałem oddzielną klasę do DataContext: https://4programmers.net/Pastebin/7076.

<UserControl x:Class="Odtwarzacz.UserControls.WaveformTimeline"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Odtwarzacz.UserControls"
             xmlns:WaveformTimelineM="clr-namespace:Odtwarzacz.UserControls.WaveFormTimeline_Model"
             mc:Ignorable="d" 
             d:DesignHeight="50" d:DesignWidth="300">
    <Grid>
        <Canvas x:Name="hCanvas">
            <Canvas.DataContext>
                <WaveformTimelineM:cPointsCollection ControlWidth="{Binding ElementName=hCanvas, Path=ActualWidth}"/>
            </Canvas.DataContext>
            <Polygon Points="{Binding Path=UpperPoints, UpdateSourceTrigger=PropertyChanged}" Stroke="Black" StrokeThickness="1"/>
            <Polygon Points="{Binding Path=LowerPoints, UpdateSourceTrigger=PropertyChanged}" Stroke="Black" StrokeThickness="1"/>
            <TextBlock Text="{Binding Path=ControlWidth}"/>
        </Canvas>
    </Grid>
</UserControl>

Chcę w owej klasie, aby właściwości ControlWidth i ControlHeight odzwierciedlały wysokość i szerokość Canvasa. Niestety cały czas są równe 0. Co robię źle?

1

Spróbuj dodać własność Name do UserControl np.: Name="PlayerUserControl". Następnie zbinduj własności używając parametru ElementName np.:

<TextBlock Text="{Binding Path=ControlWidth, ElementName=PlayerUserControl, UpdateSourceTrigger=PropertyChanged}"/>

Raz: Być może nie masz prawidłowo ustawionego DataContextu i dlatego nie działa. Dodanie ElementName powinno pomóc. W Visualu na dole, w outpucie powinieneś mieć informacje o tym czy binding w ogóle doszedł do skutku. Sprawdź.

Dwa: Jeżeli nie masz ustawionego parametru UpdateSourceTrigger=PropertyChanged to zaktualizowana własność na kierunku "kod C# => kod XAML" nie zostanie zaktualizowana.

Trzy: Jeżeli wystawiasz DependencyProperty to dobrze mieć metodę callback, która wykona się kiedy własność zostanie zmieniona. U Ciebie takowej nie widzę, więc również to może być powodem niedziałania kontrolki. Metoda ma sygnaturę mniej więcej: void OnSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) i deklaruje się ją jako callback podczas tworzenia property: DependencyProperty.Register.

1 użytkowników online, w tym zalogowanych: 0, gości: 1