Hello. I try to set ChartAnnotationLabelDefinition.Template in the way where the label of annotation has red color. But I havn't got the required result yet. I wrote the following XAML markup:
<
telerik:RadCartesianChart
Visibility
=
"{Binding IsAbsoluteBarChartVisible}"
>
<!--The definition of an annotation line-->
<
telerik:RadCartesianChart.Annotations
>
<
telerik:CartesianGridLineAnnotation
Axis
=
"{Binding ElementName=verticalAxis}"
Value
=
"{Binding AnnotationValue}"
Label
=
"{Binding AnnotationLabel}"
Stroke
=
"Red"
StrokeThickness
=
"2"
DashArray
=
"8 2"
>
<
telerik:CartesianGridLineAnnotation.LabelDefinition
>
<
telerik:ChartAnnotationLabelDefinition
Location
=
"Inside"
VerticalAlignment
=
"Bottom"
HorizontalAlignment
=
"Center"
>
<!--HERE IS THE TEMPLATE DEFINITION-->
<
telerik:ChartAnnotationLabelDefinition.Template
>
<
DataTemplate
>
<
TextBlock
Foreground
=
"Red"
FontWeight
=
"DemiBold"
/>
</
DataTemplate
>
</
telerik:ChartAnnotationLabelDefinition.Template
>
</
telerik:ChartAnnotationLabelDefinition
>
</
telerik:CartesianGridLineAnnotation.LabelDefinition
>
</
telerik:CartesianGridLineAnnotation
>
</
telerik:RadCartesianChart.Annotations
>
<!-- X axis-->
<
telerik:RadCartesianChart.HorizontalAxis
>
<
telerik:CategoricalAxis
/>
</
telerik:RadCartesianChart.HorizontalAxis
>
<!-- Y axis-->
<
telerik:RadCartesianChart.VerticalAxis
>
<
telerik:LinearAxis
x:Name
=
"verticalAxis"
Title
=
"Децибелы [Дб]"
Minimum
=
"{Binding ChartMinimum}"
Maximum
=
"{Binding ChartMaximum}"
MajorStep
=
"{Binding CurrentStep}"
/>
</
telerik:RadCartesianChart.VerticalAxis
>
<!--The chart itself-->
<
telerik:RadCartesianChart.Series
>
<
telerik:BarSeries
ShowLabels
=
"True"
CategoryBinding
=
"Category"
ValueBinding
=
"Value"
ItemsSource
=
"{Binding Data}"
/>
</
telerik:RadCartesianChart.Series
>
</
telerik:RadCartesianChart
>
But when I run my application and navigate to the View where charts are displayed then I see only annotation without label (please see 'AnnotationWithoutLabels.PNG' file attached). When I comment the following part of XAML markup
<
telerik:ChartAnnotationLabelDefinition.Template
>
<
DataTemplate
>
<
TextBlock
Foreground
=
"Red"
FontWeight
=
"DemiBold"
/>
</
DataTemplate
>
</
telerik:ChartAnnotationLabelDefinition.Template
>
then I see annotation with black colored label (please see 'AnnotationWithBlackColoredLabel.PNG' file attached). How do I get a bright red color for the annotation label?
If you find yourself binding your RadGridView to objects that are dynamically generated by Castle's DictionaryAdapter.
You might be surprised by the expressions that are generated by the ExpressionEditor involve a mysterious CastleDictionaryAdapterType like
Expression {Expression<System.Func<CastleDictionaryAdapterType,
bool
>>}
when you were expecting it to be:
Expression {Expression<System.Func<IDataRecord,
bool
>>}
where IDataRecord is the interface your run-time instances are generated from by DictionaryAdapter
Despite the fact that CastleDictionaryAdapterType implements your IDataRecord (and a bunch of other things) you won't be able to directly cast between them as your FilterDescriptor requires
The solution is to re-write the expression that ExpressionEditor.Expression property gives you. Here's a simple expression visitor that does that:
public
class
CastleDictionaryAdapterTypeVisitor<TInput> : ExpressionVisitor
{
private
ReadOnlyCollection<ParameterExpression> _parameters;
private
ParameterExpression _parameter;
public
Expression Modify(Expression expression_)
{
return
Visit(expression_);
}
#region Overrides of ExpressionVisitor
protected
override
Expression VisitParameter(ParameterExpression node_)
{
return
_parameter ?? (_parameter = Expression.Parameter(
typeof
(TInput), node_.Name));
}
protected
override
Expression VisitLambda<T>(Expression<T> node_)
{
_parameters = VisitAndConvert(node_.Parameters, node_.Name);
return
Expression.Lambda(Visit(node_.Body), _parameters);
}
protected
override
Expression VisitMember(MemberExpression node_)
{
return
node_.Member.DeclaringType?.ToString() ==
"CastleDictionaryAdapterType"
? Expression.Property(Visit(node_.Expression), node_.Member.Name) :
base
.VisitMember(node_);
}
#endregion
}
You can use it like this (I've modified the ExpressionEditor filtering RadGridView Telerik sample)
private
void
ExpressionEditor_OnExpressionChanged(
object
sender_, RadRoutedEventArgs e_)
{
if
(
this
.ExpressionEditor.Expression !=
null
&&
this
.ExpressionEditor.Expression.GetType().ToString().Contains(
"CastleDictionaryAdapterType"
))
{
var visitor =
new
CastleDictionaryAdapterTypeVisitor<ITestDataRecord>();
var convertedExpression = visitor.Modify(ExpressionEditor.Expression)
as
Expression<Func<ITestDataRecord,
bool
>>;
if
(convertedExpression !=
null
)
this
._genericFilterDescriptor.FilteringExpression = convertedExpression;
if
(!
this
.RadGridView.FilterDescriptors.Contains(
this
._genericFilterDescriptor))
this
.RadGridView.FilterDescriptors.Add(
this
._genericFilterDescriptor);
this
.errorMessageBlock.Visibility = Visibility.Collapsed;
}
else
if
(
this
.ExpressionEditor.Expression ==
null
)
{
if
(
this
.RadGridView.FilterDescriptors.Contains(
this
._genericFilterDescriptor))
this
.RadGridView.FilterDescriptors.Remove(
this
._genericFilterDescriptor);
this
.errorMessageBlock.Visibility = Visibility.Collapsed;
}
else
{
this
.errorMessageBlock.Visibility = Visibility.Visible;
}
}
What is needed here is to provide a way to signal to the ExpressionEditor the specific type/interface to use, as opposed to letting the control figure it out from its Item property.
I have a read-only List<string> property in my business object.
How do I make it show up in the property grid. Do I need to create a custom editor?
Thanks!Hi! I have a project with a RadGrid table showing information. I have this snippet of code inside it:
<telerik:GridCalculatedColumn DataFields="Stake,TotalGames" Expression="iif({1} = 0, 0, {0}/{1})"
FilterControlWidth="40px" HeaderStyle-HorizontalAlign="Right" ItemStyle-HorizontalAlign="Right"
UniqueName="AvgBet" DataFormatString="{0:N2}" HeaderText="Avg Bet (Real)" DataType="System.Decimal"
Aggregate="Avg" FooterStyle-HorizontalAlign="Right" />
Now, this works with English and Chinese locale settings. However, when we set the locale to ES, the formatting changes (from 0.00 to 0,00), and we believe that the problem is coming from the Expression in the code. We think that it might be that the values were interpreted as string? It works with English and Chinese locale (maybe because of the standard number decimal formatting).
We have tried these approaches but to no avail:
1. On binding data (OnNeedDataSource), we modify the locale like this:
if (dtable.Locale.ToString().Substring(0,2) == "es")
{
System.Globalization.CultureInfo myCultureInfo = new System.Globalization.CultureInfo("en-gb");
dtable.Locale = myCultureInfo;
}
However, this still shows the same problem.
2. We tried this as well (IsLocalizationLanguageRespected set to true or false):
<telerik:RadGrid ID="grdSessions" runat="server" GridLines="None" AllowFilteringByColumn="True"
PageSize="50" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False"
GroupHeaderItemStyle-Font-Bold="true" GroupHeaderItemStyle-ForeColor="Black"
EnableHeaderContextMenu="True" OnNeedDataSource="grdSessions_NeedDataSource"
Width="98%" ShowFooter="true" IsLocalizationLanguageRespected="false">
We are not sure how to approach this one next. Can you give me suggestions on how to proceed?
Thank you!
Psalm
Hi ,
what is LookUpPropertyDefinition ?? when Can we use it?Can you provide some document which explains and example.
Regards,
Nagasree.
I'm trying to load a collection (which is an attribute of an object) into a RadComboBox (instead of just having the id / ToString inside a textbox).
I got this working so far with a datatemplate which I apply inside the AutoGeneratingPropertyDefinition Handler.
DataTemplate dt = (DataTemplate)this.FindResource("TemplateComboBoxTemplate");
e.PropertyDefinition.EditorTemplate = dt;
The template looks like the following:<DataTemplate x:Key="TemplateComboBoxTemplate">
<telerik:RadComboBox ItemsSource="{Binding Source={StaticResource TemplateComboBoxSource}, Path=Templates}"
Margin="0">
<telerik:RadComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}" />
</DataTemplate>
</telerik:RadComboBox.ItemTemplate>
</telerik:RadComboBox>
</DataTemplate>
As I said, the above works great, except that I have no idea how to set up a two way binding
so that the RadComboBox actually reflects the property.
Hi,
In PropertyGrid I have one property "MethodName" of type string.I have to provide a custom editor of type RadComboBox for which the datasource will be dynamically getting methodnames from one particular dll. Once the user selects one methodname from combobox it should be binded to MethodName Property.
In Winforms it is easily acheivable using TypeConverters as they Pass ITypeDescriptorContext.
How to achieve this requirement in RadPropertyGrid.I have similar properties 10 or 11.So please suggest something so that I can move forward.
Regards,
Nagasree