C# 在模板中设置绑定属性

C# 在模板中设置绑定属性,c#,wpf,xaml,C#,Wpf,Xaml,是否有一种方法可以在样式中模板Binding.Converter和Binding.ValidationRules 我有下面的文本框: <TextBox x:Name="DepartTime" Height="23" HorizontalContentAlignment="Left" HorizontalAlignment="Left" Margin="3" Width="140" Style="{D

是否有一种方法可以在样式中模板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>

。。我不知道如何将转换器和验证规则合并到我的TimeOfDayTextBox样式中


非常感谢。

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

不幸的是,不是。样式只能将文本属性本身设置为绑定。它无法设置绑定的属性。此外,由于绑定不是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);
    }
}

给定控件名称,您可能还希望使用时间选择器控件而不是文本框。查看此问题:

谢谢你,迈斯特。时间选择器正是我所需要的。另外,感谢您提供的标记扩展选项。这是我今天学到的其他东西。干杯