XAML转换器不起作用

时间:2013-01-02 13:20:40

标签: c# xaml windows-8 ivalueconverter

我有一个ScreenHeightConverter,想要在ItemHeight的{​​{1}}上使用它。

但我不知道我是否正确使用它,因为如果我调试它,它甚至不会跳转到转换器。

我的代码:

GridView

2 个答案:

答案 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"

接下来,您需要将资源添加到适当的位置(UserControlWindowApp或其他对象)

<UserControl.Resources> 
 <converter:ScreenHeightConverter x:key="screenHeightConverter"/>
</UserControl.Resources>

最后,您可以通过键属性值来引用静态资源。在这种情况下"screenHeightConverter"

之后,您可以在Binding

中使用静态资源引用
<VariableSizedWrapGrid Margin="3" ItemHeight="{Binding '80',Converter={StaticResource screenHeightConverter}}" ItemWidth="255"/>