有没有办法在样式中模板化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样式中。
非常感谢。
答案 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?