我有一个ScreenHeightConverter
,想要在ItemHeight
的{{1}}上使用它。
但我不知道我是否正确使用它,因为如果我调试它,它甚至不会跳转到转换器。
我的代码:
GridView
答案 0 :(得分:2)
您的Binding
没有以正确的方式指定。
在您当前指定Binding
的方式中,您正在通过Path
属性在当前设置/继承的对象上找到名为80的属性(即DataContext
)并使用它的价值。
(属性名称不能以数字开头,我认为指示Path
的引用语法无论如何都可能是错误的...因此Binding
是错误的......和你的转换器不被召唤)。
要确认这一点,您可以在调试应用程序时查看Visual Studio中的输出窗口...它应该告知您有错误的绑定...有关详细信息,请参阅以下链接:
我相信你的意图是有一个文字常量值,传递给你的转换器以计算合适的值。
不是使用Converter
,而应该使用MarkupExtension
来做这件事.....是的,你可以用转换器“捏造它”,通过绑定到任意对象而只是将您的80值作为ConverterParameter
传递....但这不是最好的方式和大量的kludge。
以下是编写MarkupExtension的一些链接:
...所以创建一个MarkupExtension
派生类,例如HeightAdjustedExtension:MarkupExtension ....在扩展上实现ProvideValue
方法和“属性”,可以汇集传入的数据。
...那么你可以这样使用它......
ItemHeight="{myns:HeightAdjusted 80}"
这未经过测试,但是这样的事情(给你一些可以玩的东西):
public class HeightAdjustedExtension : MarkupExtension
{
[ConstructorArgument("height")]
public string Height { get; set; }
public HeightAdjustedExtension () { }
public HeightAdjustedExtension (string height)
{
Height = height;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
int theheight;
int.TryParse( Height, out theheight );
double ScreenHeight = (int)Window.Current.Bounds.Height;
double factor = 1050/(double)theheight ;
return (int)(ScreenHeight/factor);
}
}
答案 1 :(得分:0)
您需要为转换器创建资源。
首先,您需要添加namespace。实施例
xmlns:converter="clr-namespace:SDKSample;assembly=SDKSampleLibrary"
接下来,您需要将资源添加到适当的位置(UserControl
,Window
,App
或其他对象)
<UserControl.Resources>
<converter:ScreenHeightConverter x:key="screenHeightConverter"/>
</UserControl.Resources>
最后,您可以通过键属性值来引用静态资源。在这种情况下"screenHeightConverter"
。
之后,您可以在Binding
中使用静态资源引用<VariableSizedWrapGrid Margin="3" ItemHeight="{Binding '80',Converter={StaticResource screenHeightConverter}}" ItemWidth="255"/>