XAML转换器没有';不起作用
本文关键字:不起作用 转换器 XAML | 更新日期: 2023-09-27 17:50:19
我有一个ScreenHeightConverter
,希望在GridView
的ItemHeight
上使用它。
但我不知道我是否正确使用了它,因为如果我调试它,它甚至不会跳到转换器。
我的代码:
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"/>
您的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"
接下来,您需要将资源添加到适当的位置(UserControl
、Window
、App
或其他对象(
<UserControl.Resources>
<converter:ScreenHeightConverter x:key="screenHeightConverter"/>
</UserControl.Resources>
最后可以通过键属性值来引用静态资源。在这种情况下为CCD_ 18。
之后,您可以在绑定中使用静态资源引用
<VariableSizedWrapGrid Margin="3" ItemHeight="{Binding '80',Converter={StaticResource screenHeightConverter}}" ItemWidth="255"/>