可能是一个愚蠢的问题,但要在WPF ControlTemplate中为绑定设置默认值,在性能方面最好的方法是什么?
我尝试了几个选项:
ControlTemplate Trigger:效果很好,我在一个总是在我的情况下返回true的属性上使用它:
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="True">
<Setter Property="TextBoxWidth" Value="300" />
</Trigger>
</ControlTemplate.Triggers>
FallBackValue:效果也很好。
使用触发器,FallBackValue还是有其他方法可以做到这一点吗?
提前致谢
-----------------更新----------------
经过更多的研究,似乎实现我的目标的最好方法是简单地使用样式...... 我不知道为什么它首先不起作用,但这样做似乎有效:
<Style TargetType="local:EditableWidthText">
<Setter Property="TextBoxWidth" Value="300"/>
</Style>
不再需要FallbackValue。当有绑定,没有绑定以及被另一个样式覆盖时,它可以工作。正是我需要的。
感谢Sinatr对FallbackValue表现的评论。 Fyi Priority Binding:
PriorityBinding lets you associate a binding target (target) property with a list of bindings.
The first binding that returns a value successfully becomes the active binding.
https://msdn.microsoft.com/en-us/library/system.windows.data.prioritybinding%28v=vs.110%29.aspx
我从未使用模板选择器或datatemplate,但我认为这对我的需求有点过分,不是吗?
-----------------更新#2 ----------------
@Sinatr: 我有一个Mainviewmodel,它包含几个ViewModel绑定到MainView中显示的几个用户控件。 (像我的另一篇文章:Navigate through UserControl with MVVM LIGHT (WPF))
但是这个controlTemplate用于一个looklessControl(非常简单,一个标签和一个文本框)。
在这个LookLess控件中,我创建了4个依赖项属性。 在控件模板中,我将其中的2个绑定到文本框/标签的文本/内容属性 和两个宽度。 (我希望用户能够在将来创建表单,绑定方式)。 例如,ControlTemplate中的标签如下所示:
<Label
Width="{Binding Path=LabelWidth,
RelativeSource={RelativeSourceAncestorType=local:EditableWidthText}}"
Content="{Binding Path=LabelText,
RelativeSource={RelativeSource AncestorType=local:EditableWidthText}}"/>
我只是希望在没有定义绑定时宽度等于130。 但是由于绑定失败或类似的事情,我不想要性能问题。
模板选择器非常有趣,但我认为不适用于我的情况。 数据中没有切换,它只是一个默认值。所以我认为也不适用。 (但也许我错了:p)
所以也许我认为样式是要走的路?