0

我有一个ScreenHeightConverter,并且想在ItemHeight一个上使用它GridView

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

我的代码:

public class ScreenHeightConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        double ScreenHeight = (int)Window.Current.Bounds.Height;
        double factor = 1050/(double)value;
        return (int)(ScreenHeight/factor);
    }
}

<VariableSizedWrapGrid Margin="3" ItemHeight="{Binding '80',Converter={StaticResource ScreenHeightConverter}}" ItemWidth="255"/>
4

2 回答 2

2

Binding的指定方式不正确。

在您当前指定的方式中,您说的是在当前通过该属性设置/继承的对象上Binding找到一个名为 80 的属性(即)并使用它的值。PathDataContext

(属性名称不能以数字开头,我认为引用的语法表示Path无论如何可能是错误的......因此Binding是错误的......并且您的转换器不会被调用)。

要确认这一点,您可以在调试应用程序时查看 Visual Studio 中的输出窗口...它应该会通知您有错误的绑定...有关详细信息,请参阅以下链接:


我相信你的意图是有一个字面常量值传递给你的转换器以计算一个合适的值。

而不是使用 a Converter,您应该考虑使用 a MarkupExtension......是的,您可以通过绑定到任意对象并将您的 80 值作为 a ConverterParameter.... 传递来使用转换器“捏造”它。但事实并非如此最好的方法和一个大杂烩。

以下是一些关于编写 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);        
    }
}
于 2013-01-02T13:31:04.807 回答
0

您需要为转换器创建资源。

首先,您需要添加命名空间。例子

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"/>
于 2013-01-02T13:25:40.970 回答