【问题标题】:How to transform a Binding markup extension from inline to element syntax?如何将绑定标记扩展从内联转换为元素语法?
【发布时间】:2012-08-19 02:52:47
【问题描述】:

我是一个完整的 .NET/C# nublet。我继承了一些使用 XAML 为窗口定义 UI 的代码,并且我正在尝试与一些现有的 XML 垃圾进行交互。这可能是一个非常简单的问题;我只是不知道谷歌是什么。

我有一个要基于布尔值禁用的文本框。我可以用这段代码做到这一点:

清单 A:

<TextBox x:Name="ServerNameTextBox" ... IsEnabled="{Binding ServerName.Editable}" />

当我想将它基于一个变量一个复选框时,问题就来了。我已经阅读了 IMultiValueConverter 并为此写了一篇,但我不确定如何指定绑定,因为格式会发生变化。

清单 B:

<TextBox x:Name="ServerNameTextBox" ... >
    <TextBox.IsEnabled>
        <Binding ElementName="CheckBoxServerNameEnabled" Path="IsChecked" />
        <Binding ??? />
     </TextBox.IsEnabled>
</TextBox>

为了提供与第一行相同的引用,问号中需要填写什么?告诉我在清单 A 中使用的绑定类型被称为加分。

谢谢!

【问题讨论】:

    标签: c# .net wpf xaml multibinding


    【解决方案1】:
    【解决方案2】:

    {Binding ServerName.Editable} 是 (in this case) 等价于 {Binding Path=ServerName.Editable}

    所以在你的MultiBinding 中你有

    <MultiBinding Converter="...">
        <Binding ElementName="CheckBoxServerNameEnabled" Path="IsChecked"/>
        <Binding Path="ServerName.Editable"/>
    </MultiBinding>
    

    markup extensions 中,未命名的参数被传递给构造函数,Binding 有一个constructor which takes a path

    【讨论】:

    • 参数如何传入标记扩展构造函数?或者,如何设置标记扩展参数?
    • @JRo:这都是幕后的反思,你到底想知道什么,为什么? IE。你的目标/问题是什么?
    • 从您的示例中,我看不到如何将参数传递给标记扩展,因为所有属性都适用于 Binding 基类。我(不熟练地)玩弄了&lt;MultiBinding&gt; 元素和子元素,并在下面发布了我发现的答案。简而言之,标记扩展类可以用作&lt;Binding&gt; 元素(例如&lt;Binding_Derived_MarkupExtension&gt;)。那么扩展的参数就是 XML 元素的属性。
    • @JRo:好吧,由于标记扩展可以以元素形式出现,我始终确保它们只能用于属性分配,并且所有非空构造函数都是可选的。
    • 这很有意义,尤其是在这种情况下。感谢您的观点。
    【解决方案3】:

    由于标记扩展类是从Binding 派生的,因此我能够替换 XML 元素标记。例如:

    之前:

       <local:FolderBox Text="{xset:XSettings Folders.BuildRoot}"/>
    

    之后:

       <local:FolderBox>
          <local:FolderBox.Text>
             <MultiBinding Converter="{StaticResource Precedence}" Mode="TwoWay">
                <xset:XSettings Prefix="Folders.BuildRoot" BindNow="True"/>
                <Binding ElementName="BuildRoot" Path="Text"/>
             </MultiBinding>
          </local:FolderBox.Text>
       </local:FolderBox>
    

    但是,现在调用构造函数时不带参数。所以我不得不使用“ConstructorArgument”,最后一个“BindNow”参数用于逻辑运行构造函数代码。例如:

    public class XSettingsExtension : Binding
    {
       [ConstructorArgument("Prefix")]
       public string Prefix { get; set; }
    
       private bool _BindingSet;
       [ConstructorArgument("BindNow")]
       public bool BindNow
       {
          get { return this._BindingSet; }
          set { this._BindingSet = value; SetBinding(); }
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多