Помещение многообедения на одну линию в XAML
-
23-10-2019 - |
Вопрос
Есть ли способ принять это многообещающее:
<TextBox.IsEnabled>
<MultiBinding Converter="{StaticResource LogicConverter}">
<Binding ElementName="prog0_used" Path="IsEnabled" />
<Binding ElementName="prog0_used" Path="IsChecked" />
</MultiBinding>
</TextBox.IsEnabled>
и положить все на одну линию, как в <TextBox IsEnabled="" />
?
Если да, то где я могу выучить правила этого формата?
Решение
Лучшим (и более простым) подходом было бы определить стиль как ресурс, который вы можете легко применить к любому текстовому поле:
<Window.Resources>
<c:MyLogicConverter x:Key="LogicConverter" />
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}" x:Key="MultiBound">
<Setter Property="IsEnabled">
<Setter.Value>
<MultiBinding Converter="{StaticResource LogicConverter}">
<Binding ElementName="switch" Path="IsEnabled" />
<Binding ElementName="switch" Path="IsChecked" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<StackPanel Orientation="Horizontal">
<CheckBox Name="switch" />
<TextBox Name="textBox2" Text="Test" Style="{StaticResource MultiBound}" />
</StackPanel>
Другие советы
Это можно сделать с помощью пользовательского расширения разметки:
public class MultiBinding : System.Windows.Data.MultiBinding
{
public MultiBinding (BindingBase b1, BindingBase b2)
{
Bindings.Add(b1);
Bindings.Add(b2);
}
public MultiBinding (BindingBase b1, BindingBase b2, BindingBase b3)
{
Bindings.Add(b1);
Bindings.Add(b2);
Bindings.Add(b3);
}
// Add more constructors if you need.
}
Применение:
<TextBox IsEnabled="{local:MultiBinding
{Binding IsEnabled, ElementName=prog0_used},
{Binding IsChecked, ElementName=prog0_used},
Converter={StaticResource LogicConverter}}">
Для многоотборения нет сокращенной строки. Вам нужно использовать синтаксис расширенного элемента.
Я попытался использовать ответ Discord, но он не сработал прямо из коробки. Чтобы заставить его работать, я добавил новый конструктор:
public class MultiBinding : System.Windows.Data.MultiBinding
{
public MultiBinding(BindingBase b1, BindingBase b2, object converter)
{
Bindings.Add(b1);
Bindings.Add(b2);
Converter = converter as IMultiValueConverter;
}
}
Использование будет тогда таким:
<TextBox IsEnabled="{local:MultiBinding {Binding IsEnabled, ElementName=prog0_used},
{Binding IsChecked, ElementName=prog0_used},
{StaticResource LogicConverter}}">
Не связан с StackOverflow