我是一个完整的.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中使用的绑定类型。
谢谢!
答案 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(); }
}