由于您显然无法在C#中创建Silverlight DataTemplate,我正在尝试在XAML中创建一个。我有一个我需要引用的转换器,我在另一个命名空间中用C#定义。我试过这样做:
<UserControl.Resources>
<DataTemplate x:Key="PriceTemplate">
<TextBlock Text="{Binding Price, Converter={Converters:PriceConverter}}" />
</DataTemplate>
</UserControl.Resources>
转换器是指向正确名称空间的xmlns。但是,我收到一个编译错误:
输入'转换器:PriceConverter'是 像标记扩展一样用,但确实如此 不是从MarkupExtension派生的。
我尝试将System.Windows.Markup.MarkupExtension添加为我的转换器的父级,但它在Silverlight中显然不存在。
如何在XAML中引用我的转换器,而不必在XAML中重写它?
答案 0 :(得分:10)
您希望首先创建静态资源,然后绑定到作为静态资源的转换器。
<UserControl.Resources>
<conv:IntConverter x:Key="IntConverter"></conv:IntConverter>
</UserControl.Resources>
<StackPanel>
<TextBlock x:Name="Result" Margin="15" FontSize="20"
HorizontalAlignment="Center" VerticalAlignment="Center"
Text="{Binding Converter={StaticResource IntConverter}}">
</TextBlock>
</StackPanel>
</Window>
因此,“conv:”xml命名空间已在文档顶部注册,就像使用自定义控件一样:
xmlns:conv="clr-namespace:MyFooCompany.Converters"
此示例改编自以下关于WPF相同问题的链接教程:
http://www.dev102.com/2008/07/17/wpf-binding-converter-best-practices/
答案 1 :(得分:3)
您似乎将类型与实例混淆。转换器类型将存在于命名空间中,但在绑定中我们未指定类型作为转换器。相反,我们为绑定提供该类型的实际实例。
通常IValueConverter
个实例是无状态的,因此我们可以在加载DataTemplate实例的资源字典链中的任何位置保存一个公共实例。
在xaml中,我们可以通过创建一个新的别名来引用另一个命名空间来覆盖它。考虑到这一点,你的xaml看起来像这样: -
<UserControl x:Class="SilverlightApplication1.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SilverlightApplication1"
xmlns:localConverters="clr-namespace:SilverlightApplication1.Converters">
<UserControl.Resources>
<localConverters:PriceConverter x:Key="PriceConverter" />
<DataTemplate x:Key="Test">
<TextBlock Text="{Binding Price, Converter={StaticResource PriceConverter}}" />
</DataTemplate>
</UserControl.Resources>
答案 2 :(得分:1)
<RadioButton GroupName="Group1">
<RadioButton.Template>
<ControlTemplate>
<ToggleButton IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}">
<ToggleButton.Content>
<SymbolIcon Symbol="Edit"/>
</ToggleButton.Content>
<ToolTipService.ToolTip>
<ToolTip Content="Sample Tooltip" Placement="Mouse" />
</ToolTipService.ToolTip>
</ToggleButton>
</ControlTemplate>
</RadioButton.Template>
</RadioButton>
添加到@Rokk 发布的答案中。