1

我是一个完整的 .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 中使用的绑定类型被称为什么类型的加分。

谢谢!

4

3 回答 3

3

{Binding ServerName.Editable}是(在这种情况下)等价于 {Binding Path=ServerName.Editable}

所以在你的MultiBinding你有

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

标记扩展中,未命名的参数被传递给构造函数,Binding具有一个接受路径的构造函数。

于 2012-08-23T14:44:57.943 回答
1

您快到了。检查http://msdn.microsoft.com/en-us/library/system.windows.data.multibinding.aspx

于 2012-08-23T14:42:02.880 回答
0

由于标记扩展类派生自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(); }
   }
于 2017-04-04T19:40:39.227 回答