【问题标题】:How to assign a datatemplate to textbox wpf如何将数据模板分配给文本框wpf
【发布时间】:2010-07-02 16:28:01
【问题描述】:

TextBox 应该显示某些访问权限的屏蔽美元金额。我创建了一个转换器类(继承自 IValueConverter),通过实现 convert 方法来处理屏蔽。

public object Convert(object value, Type targetType, object parameter, 
                  CultureInfo culture)

如果需要屏蔽,第三个参数为 true,否则为 false。

这样称呼:

CurrencyCOnverter converter = new CurrencyConverter();

this._textbox1.Text = converter.Convert(Amount, typeof(string), !this.IsSuperUser,
                          CurrentCulture).ToString();

我在 UI 上有大约 12 个文本框。我没有在 12 个地方这样做,而是在 Resource 字典中定义了 DataTemplates,如下所示:

<DataTemplate x:Key="MaskNormalBackgroundTbx">

 <TextBlock TextAlignment="Right" VerticalAlignment="Center"
            TextWrapping="WrapWithOverflow" 
            Text="{Binding "Amount" 
                   Converter={StaticResource CurrencyDisplayConverter}, 
                   ConverterParameter=true}" />    
</DataTemplate>

 <DataTemplate x:Key="NoMaskNormalBackgroundTbx">

 <TextBlock TextAlignment="Right" VerticalAlignment="Center" 
            TextWrapping="WrapWithOverflow" 
            Text="{Binding "Amount" 
                   Converter={StaticResource CurrencyDisplayConverter}, 
                   ConverterParameter=false}" />    
 </DataTemplate>

我的问题:有没有一种方法可以通过创建自定义文本框来将此模板分配给文本框,就像我们为 ListBox 分配数据模板一样?

谢谢,

梅根。

【问题讨论】:

    标签: wpf textbox


    【解决方案1】:

    您可以使用 ContentControl 来显示您的 DataTemplate。在这种情况下,我更喜欢的另一个想法是使用样式。下面的代码显示了两者兼而有之。

    <Window x:Class="Test.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Test="clr-namespace:Test"
        Height="300" Width="300">
    
        <Window.Resources>
    
            <Test:CurrencyDisplayConverter x:Key="CurrencyDisplayConverter" />
    
            <DataTemplate x:Key="MaskNormalBackgroundTbxDT">
                <TextBlock TextAlignment="Right" VerticalAlignment="Center" 
                TextWrapping="WrapWithOverflow"  
                Text="{Binding Converter={StaticResource CurrencyDisplayConverter}, ConverterParameter=true}" />
            </DataTemplate>
    
            <Style x:Key="MaskNormalBackgroundTbxStyle" TargetType="TextBlock">
                <Setter Property="TextAlignment" Value="Right" />
                <Setter Property="VerticalAlignment" Value="Center" />
                <Setter Property="TextWrapping" Value="WrapWithOverflow" />
                <Setter Property="Text" Value="{Binding Path=Amount, Converter={StaticResource CurrencyDisplayConverter}, ConverterParameter=true}" />
            </Style>
    
        </Window.Resources>
        <StackPanel>
    
            <ContentControl
                Content="{Binding Path=Amount}" 
                ContentTemplate="{StaticResource MaskNormalBackgroundTbxDT}" />
    
            <TextBlock 
                Style="{StaticResource MaskNormalBackgroundTbxStyle}" />
    
        </StackPanel>
    
    </Window>
    

    【讨论】:

    • 华尔街程序员,感谢您的回复。我已经有一个带有标签和其他自定义控件模板和属性的自定义文本框。我会添加它而不是替换文本框控件本身。如果您对如何使其与文本框控件一起使用有任何想法,请告诉我。谢谢。
    • 使用上面示例中的样式(MaskNormalBackgroundTbxStyle)
    • 在自定义文本框的样式中插入了这个触发器: 不知道为什么,文本框中的文本永远不会被屏蔽。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多