我创建了一个自定义控件,它基本上显示了DataGrid(teleriks RadDataGrid)中显示的行数。
我可以按如下方式使用它:
<utility:GridFooter Grid.Row="2" SourceGrid="{Binding ElementName=GrdResult}" />
在ControlTemplate
的{{1}}我将GridFooter
- 属性绑定到TextBlock:
Count
这是转换器:
<TextBlock Text="{Binding Path=SourceGrid.Items.Count, RelativeSource={RelativeSource TemplatedParent},
Converter={StaticResource IntToFormatStringConverter}, ConverterParameter=N0}" />
所以我更进一步,用VS2015 Live Visual Tree 查找[ValueConversion(typeof(int), typeof(string))]
public class IntToFormatStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return "0";
var i = (int) value;
var format = parameter as string;
if (format == null)
return i.ToString(culture);
// I have set a breakpoint here, and the value is alaways
// correct, even if its not what is beeing displayed
// So, It's not the Converter
var ret = i.ToString(format, culture);
return ret;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
。在 Live Property Explorer 中,TextBlock
- 属性具有BindingExpression。在扩展Text
- 属性时,评估值 可以正常显示!
我将举几个例子。
Text
评估值:TextBlock.Text
,在用户界面中显示:"11"
1
评估值:TextBlock.Text
,在用户界面中显示:"325"
似乎在错误情况下,仅显示评估值的第一个字符。也说:评估价值又名。 3
是正确的。因此,我在列表中看到Grid.Items.Count
项目,325
的评估值为TextBox.Text
,并显示为"325"
。
以上行为有时只会发生。我在多个地方使用
3
没有问题,但也没有显着差异。
如果有人知道此问题或对此有任何可能的解决方法,请告知我们。
我注意到,在重绘时,值会正确显示。如果是GridFooter
在控件内部使用,可以放置和停靠它,只需移动一下就可以重新绘制并立即显示丢失的数字。
此外,我找到了解决方法,将GridFooter
更改为Width="Auto"
之类的固定值将停止该错误。但是我仍然想知道,是什么导致错误的绘画。
答案 0 :(得分:0)
这看起来可能是剪辑问题(即文本框没有填满所有可用空间,所以只显示第一个字符),试试这个:
<TextBlock HorizontalAlignment="Stretch" Text="{Binding Path=SourceGrid.Items.Count, RelativeSource={RelativeSource TemplatedParent},
Converter={StaticResource IntToFormatStringConverter}, ConverterParameter=N0}" />
关键部分是 HorizontalAlignment="Stretch"
属性。