在模板中设置绑定属性

时间:2010-08-08 08:34:55

标签: c# wpf xaml

有没有办法在样式中模板化Binding.Converter和Binding.ValidationRules?

例如:我有以下文本框:

            <TextBox x:Name="DepartTime" Height="23" HorizontalContentAlignment="Left" HorizontalAlignment="Left" 
                Margin="3" Width="140" 
                Style="{DynamicResource TimeOfDayTextBox}">
                <TextBox.Text>
                    <!--  Textbox notifies changes when Text is changed, and not focus. -->
                    <Binding Path="FlightDepartTime" StringFormat="{}{0:hh:mm tt}" >
                        <Binding.Converter>
                            <convert:TimeOfDayConverter />
                        </Binding.Converter>
                        <Binding.ValidationRules>
                            <!--  Validation rule set to run when binding target is updated. -->
                            <validate:ValidateTimeOfDay ValidatesOnTargetUpdated="True" />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>

..我无法弄清楚如何将Converter和Validation规则合并到我的TimeOfDayTextBox样式中。

非常感谢。

2 个答案:

答案 0 :(得分:1)

样式只能包含一组可以应用于多个控件的公共属性。在您的情况下,转换器和验证规则不应用于文本框,而是应用于绑定的内容,因此它们特定于单个元素,不能在样式中使用。

答案 1 :(得分:1)

不幸的是,没有。该样式只能将Text属性本身设置为Binding。它无法设置绑定的属性。此外,由于Binding不是DependencyObject,因此无法设置绑定样式。

您必须使代码更简洁的一个选项是使用自定义MarkupExtension来创建所需的绑定:

public class TimeOfDayBinding
    : MarkupExtension
{
    public PropertyPath Path { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var binding = new Binding()
        {
            Path = Path,
            Converter = new TimeOfDayConverter(),
        };
        binding.ValidationRules.Add(new ValidateTimeOfDay()
        {
            ValidatesOnTargetUpdated = true,
        });
        return binding.ProvideValue(serviceProvider);
    }
}

根据您的控件名称,您可能还想使用时间选择器控件而不是TextBox。看看这个问题:What is currently the best, free time picker for WPF?