如何将Binding标记扩展从内联转换为元素语法?

时间:2012-08-23 14:40:04

标签: c# .net wpf xaml multibinding

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

我想要基于布尔值禁用的TextBox。我可以用这段代码来做到这一点:

清单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中使用的绑定类型。

谢谢!

3 个答案:

答案 0 :(得分:3)

{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

答案 1 :(得分:1)

答案 2 :(得分:0)

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

在:

   <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”参数用于逻辑运行构造函数代码。 E.g:

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(); }
   }