XAML转换器没有';不起作用

本文关键字:不起作用 转换器 XAML | 更新日期: 2023-09-27 17:50:19

我有一个ScreenHeightConverter,希望在GridViewItemHeight上使用它。

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

我的代码:

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"/>

XAML转换器没有';不起作用

您的Binding没有以正确的方式指定。

按照您当前指定Binding的方式,在当前通过DataContext属性设置/继承的对象上找到一个名为80的属性(即Path(,并使用其值。

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

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

  • http://www.zagstudio.com/blog/486#.UOQ3qofZbKE
  • PresentationTraceSources的任何原因。TraceLevel=High不会将任何信息打印到输出窗口

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

与其使用Converter,不如考虑使用MarkupExtension。。。。。是的,您可以通过绑定到任意对象并将80值作为ConverterParameter传递给转换器来"伪造"它。。。。但这不是最好的方式,而且是个大杂烩。

以下是一些关于编写MarkupExtension:的链接

  • http://www.codeproject.com/Articles/140618/WPF-Tutorial-TypeConverter-Markup-Extension
  • http://drwpf.com/blog/category/markup-extensions/
  • http://miteshsureja.blogspot.co.uk/2011/07/custom-markup-extension-in-wpf.html
  • http://10rem.net/blog/2011/03/09/creating-a-custom-markup-extension-in-wpf-and-soon-silverlight

因此创建一个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);        
    }
}

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

首先需要添加命名空间。示例

xmlns:converter="clr-namespace:SDKSample;assembly=SDKSampleLibrary"

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

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

最后可以通过键属性值来引用静态资源。在这种情况下为CCD_ 18。

之后,您可以在绑定中使用静态资源引用

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