1
votes

BusyIndicator.xaml

<UserControl x:Class="Eigen.Modules.Modelling.Components.BusyIndicator"
             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:Eigen.Modules.Modelling.Components"
             xmlns:telerikControls="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls"
             xmlns:gif="http://wpfanimatedgif.codeplex.com"
             mc:Ignorable="d" 
             d:DesignHeight="150" d:DesignWidth="150"
             DataContext="{Binding RelativeSource={RelativeSource Self}}">

    <Grid Width="{Binding Width}" Height="{Binding Height}">
        <telerikControls:RadBusyIndicator IsIndeterminate="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=IsIndeterminate}">
            <Border BorderBrush="White" Background="#A9FFFFFF" BorderThickness="1">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>

                    <Border Padding="5,0" Grid.Row="0">
                        <Image gif:ImageBehavior.AnimatedSource="/`enter code here`Resources/matriksenerji.gif" gif:ImageBehavior.AutoStart="True"/>
                    </Border>

                    <Border Padding="5" Grid.Row="1">
                        <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=Label}" FontWeight="SemiBold" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
                    </Border>
                </Grid>
            </Border>
        </telerikControls:RadBusyIndicator>
    </Grid>
</UserControl>

BusyIndicator.xaml.cs

public partial class BusyIndicator : UserControl
{
    public BusyIndicator()
    {
        InitializeComponent();
    }



    public string Label
    {
        get { return (string)GetValue(LabelProperty); }
        set { SetValue(LabelProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Label.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty LabelProperty =
        DependencyProperty.Register("Label", typeof(string), typeof(MatriksBusyIndicator), new PropertyMetadata(string.Empty));



    public bool IsIndeterminate
    {
        get { return (bool)GetValue(IsIndeterminateProperty); }
        set { SetValue(IsIndeterminateProperty, value); }
    }

    // Using a DependencyProperty as the backing store for IsProgress.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsIndeterminateProperty =
        DependencyProperty.Register("IsIndeterminate", typeof(bool), typeof(MatriksBusyIndicator), new PropertyMetadata(true));

}

Using in Page.xaml

...

<!--BusyIndicator-->
<components:BusyIndicator IsIndeterminate="True" 
                          Visibility="{Binding IsProgress, Converter={StaticResource BoolToVisConverter}}" 
                          Label="{lex:Loc CalculatingProgress}"
                          Grid.Column="1" 
                          VerticalAlignment="Center" 
                          HorizontalAlignment="Center" 
                          Width="150" Height="150"/>

...

Error message;

System.Windows.Data Error: 40 : BindingExpression path error: 'IsProgress' property not found on 'object' ''BusyIndicator' (Name='')'. BindingExpression:Path=DataContext.IsProgress; DataItem='BusyIndicator' (Name=''); target element is 'BusyIndicator' (Name=''); target property is 'Visibility' (type 'Visibility')

ViewModel class has "IsProgress" property but can't bind to usercontrol.

2
what is the datacontext of Page.xaml?daryal
A viewmodel class. @daryalAERO.

2 Answers

2
votes

In the UserControl definition you have the following line:

DataContext="{Binding RelativeSource={RelativeSource Self}}"

It means that the DataContext for that control is the control itself. So WPF is trying to find the IsProgress property in this control. As I understand, the IsProgress property is defined in the ViewModel of your Page.

So the best option to fix it is just to remove above line.

Additionaly to fix Width and Height bindings in control add RelativeSource={RelativeSource AncestorType={x:Type UserControl}} to them.

1
votes

You could try a trace:

Visibility="{Binding IsProgress, , diag:PresentationTraceSources.TraceLevel=High, Converter={StaticResource BoolToVisConverter}}" 

I suggest you take a look here: debugging WPF binding problems