C# WPF MVVM中控件模板绑定的默认值

C# WPF MVVM中控件模板绑定的默认值,c#,wpf,xaml,binding,mvvm-light,C#,Wpf,Xaml,Binding,Mvvm Light,这可能是个愚蠢的问题,但要在WPF ControlTemplate中为绑定设置默认值,在性能方面最好的方法是什么 我尝试了几种选择: 优先级绑定:它不起作用,可能是我的错 ControlTemplate触发器:工作正常,我在一个属性上使用它,该属性在我的情况下总是返回true: <ControlTemplate.Triggers> <Trigger Property="IsEnabled" Value="True"> <Setter Pro

这可能是个愚蠢的问题,但要在WPF ControlTemplate中为绑定设置默认值,在性能方面最好的方法是什么

我尝试了几种选择:

  • 优先级绑定:它不起作用,可能是我的错
  • ControlTemplate触发器:工作正常,我在一个属性上使用它,该属性在我的情况下总是返回true:

    <ControlTemplate.Triggers>
        <Trigger Property="IsEnabled" Value="True">
            <Setter Property="TextBoxWidth" Value="300" />
        </Trigger>
    </ControlTemplate.Triggers>
    

    我从未使用过模板选择器或数据模板,但我认为这对于我的需要来说有点过分了,不是吗

    -----------------更新#2----------------

    @西纳特: 我有一个Mainviewmodel,它包含几个绑定到MainView中显示的几个用户控件的ViewModel。 (类似于我的另一篇帖子:)

    但是这个controlTemplate用于一个无外观的控件(非常简单的东西,只是一个标签和一个文本框)

    在这个无外观控件中,我创建了4个依赖项属性。 在控件模板中,我将其中两个绑定到Textbox/标签的文本/内容属性 两个和它们的宽度相同。(我希望用户将来能够以绑定方式创建表单)。 例如,ControlTemplate中的标签如下所示:

     <Label   
        Width="{Binding Path=LabelWidth,
             RelativeSource={RelativeSourceAncestorType=local:EditableWidthText}}" 
        Content="{Binding Path=LabelText, 
             RelativeSource={RelativeSource AncestorType=local:EditableWidthText}}"/>
    
    
    
    我只希望宽度等于130,当没有定义绑定时。 但我不想因为绑定失败或诸如此类的事情而出现性能问题

    模板选择器非常有趣,但我认为这不适用于我的情况。 数据中没有切换,它只是一个默认值。所以我认为这也不适用。 (但也许我错了:p)


    因此,也许我认为样式是一种选择?

    FallbackValue或TargetNullValue取决于条件。
    FallbackValue
    意味着您有绑定错误(您应该不惜一切代价避免绑定错误,因为它们很昂贵,并且会显著影响性能),它主要在设计时用于在您还没有绑定的情况下提供一些东西<代码>触发器是切换模板(或任何其他内容)的常用方法。我不知道您称之为优先级绑定是什么,但您忘记了模板选择器(应用模板的自定义逻辑)或简单数据模板(模板取决于绑定属性的类型)。至于你的情况,可以使用触发器。@Sinatr这是一个误导性的评论,朋友。FallbackValue决不会自动指示绑定错误。它只是在没有可用值时调用,这并不一定表示绑定中有错误。例如,一个没有值的输入不一定表示有错误。@ChrisW.,我很乐意了解它,现在我对我写的内容非常了解。@Speuline,我不知道在您的案例中选择模板的逻辑是什么。我同样使用数据模板(例如绑定到持有不同视图模型的
    ObservableCollection
    ,在它们之间切换将切换视图中的模板)和模板选择器(请参阅和)。还有不同的触发因素,你在寻找吗?
    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.
    
     <Label   
        Width="{Binding Path=LabelWidth,
             RelativeSource={RelativeSourceAncestorType=local:EditableWidthText}}" 
        Content="{Binding Path=LabelText, 
             RelativeSource={RelativeSource AncestorType=local:EditableWidthText}}"/>