This is a migrated thread and some comments may be shown as answers.

LabelProperties do not listen on property change when DataContext is set after InitializeComponent

2 Answers 93 Views
Gauges
This is a migrated thread and some comments may be shown as answers.
Robert
Top achievements
Rank 1
Robert asked on 02 Jul 2009, 06:28 AM
If i have a trigger on IsEnabled in my LabelProperties style an bind that to a DependecyProperty in my ViewModel the Trigger will not 'fire' when i set the DataContext after InitilizeComponent only if i set it before. The problem with this is that IsEnable will  not work if i set the DataContext in xaml on a UserControl containing the gauge. I think that this is a faulty behavior because Minor/MajorTickStyle works if i set the DataContext after InitilizeComponent.

well this thread is useless without code so...

my usercontrol

<UserControl x:Class="WpfTest_Telerik.UserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" 
    Width="300" Height="300">  
    <UserControl.Resources> 
 
        <Style x:Key="MajorTickStyle" TargetType="{x:Type telerik:TickProperties}">  
            <Setter Property="Background" Value="White" /> 
            <Style.Triggers> 
                <Trigger Property="IsEnabled" Value="False">  
                    <Setter Property="Background" Value="Black" /> 
                </Trigger> 
            </Style.Triggers> 
        </Style> 
 
        <Style x:Key="LabelProperties" TargetType="{x:Type telerik:LabelProperties}">  
            <Setter Property="Foreground" Value="White" /> 
            <Style.Triggers> 
                <Trigger Property="IsEnabled" Value="False">  
                    <Setter Property="Foreground" Value="Black" /> 
                </Trigger> 
            </Style.Triggers> 
        </Style> 
 
    </UserControl.Resources> 
    <Grid> 
        <telerik:RadGauge> 
            <telerik:RadialGauge> 
                <telerik:RadialScale> 
                    <telerik:RadialScale.MajorTick> 
                        <telerik:TickProperties IsEnabled="{Binding Path=IsActive}" Style="{StaticResource MajorTickStyle}"/>  
                    </telerik:RadialScale.MajorTick> 
                    <telerik:RadialScale.Label > 
                        <telerik:LabelProperties IsEnabled="{Binding Path=IsActive}"  Style="{StaticResource LabelProperties}" /> 
                    </telerik:RadialScale.Label> 
                </telerik:RadialScale> 
            </telerik:RadialGauge> 
        </telerik:RadGauge> 
    </Grid> 
</UserControl> 

code behind

using System.Windows.Controls;  
 
namespace WpfTest_Telerik  
{  
    /// <summary>  
    /// Interaction logic for UserControl1.xaml  
    /// </summary>  
    public partial class UserControl1 : UserControl  
    {  
        public UserControl1()  
        {  
            // will work  
            //DataContext = new UserControl1ViewModel();  
            InitializeComponent();  
            // will not work  
            DataContext = new UserControl1ViewModel();  
        }  
    }  

my viewmodel

using System;  
using System.Windows;  
using System.Timers;  
using System.Windows.Threading;  
 
namespace WpfTest_Telerik  
{  
    public class UserControl1ViewModel : DependencyObject  
    {  
        private readonly Dispatcher _currentDispatcher;  
 
        public UserControl1ViewModel()  
        {  
            _currentDispatcher = Dispatcher.CurrentDispatcher;  
 
            var timer = new Timer(2000);  
            timer.Elapsed += TimerElapsed;  
            timer.Start();  
        }  
 
        void TimerElapsed(object sender, ElapsedEventArgs e)  
        {  
            Action x = () => IsActive = !IsActive;  
 
            _currentDispatcher.BeginInvoke(x);  
        }  
 
        public bool IsActive  
        {  
            get { return (bool)GetValue(IsActiveProperty); }  
            set { SetValue(IsActiveProperty, value); }  
        }  
 
        // Using a DependencyProperty as the backing store for IsActive.  This enables animation, styling, binding, etc...  
        public static readonly DependencyProperty IsActiveProperty =  
                DependencyProperty.Register("IsActive"typeof(bool), typeof(UserControl1ViewModel), new UIPropertyMetadata(false));  
    }  

2 Answers, 1 is accepted

Sort by
0
Andrey
Telerik team
answered on 03 Jul 2009, 01:19 PM
Hi Robert,

It seems there is a problem in using of data context inheritance with other inheritable properties like to the Foreground or font related properties.
I think as workaround you could use a binding to setup the data context for gauge labels.
As sample you could add the following setter to your LabelProperties style:
<Setter Property="DataContext" Value="{Binding}" />

Kind regards,
Andrey Murzov
the Telerik team

Instantly find answers to your questions on the new Telerik Support Portal.
Check out the tips for optimizing your support resource searches.
0
Robert
Top achievements
Rank 1
answered on 06 Jul 2009, 06:00 AM
Works like a charm now, thanks!
Tags
Gauges
Asked by
Robert
Top achievements
Rank 1
Answers by
Andrey
Telerik team
Robert
Top achievements
Rank 1
Share this question
or