BindingProxyMarkup ru - Leksiqq/WpfMarkupExtension GitHub Wiki
Используется, когда необходимо разместить значение привязки там, где требуется расширение разметки.
BindingProxy
- объект типа BindingProxy
содержащий привязку.
Пусть нам нужно использовать конкретный экземпляр конвертера или разные конвертеры, в зависимости от каких-то условий.
В AboutConverter.xaml.cs
:
...
public IUniversalConverter Converter { get; init; }
public AboutConverter(IUniversalConverter converter)
{
Converter = converter;
InitializeComponent();
}
...
В AboutConverter.xaml
:
<Window.Resources>
<ResourceDictionary>
<l:BindingProxy Value="{Binding Converter}" x:Key="ConverterProxy"/>
<l:BindingProxyMarkup x:Key="Converter" BindingProxy="{StaticResource ConverterProxy}"/>
</ResourceDictionary>
</Window.Resources>
<DockPanel LastChildFill="True">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Text="Используется " FontSize="24"
Foreground="{Binding Converter={StaticResource Converter}, ConverterParameter=Color}"/>
<TextBlock Text="{Binding Converter, Converter={StaticResource Converter}, ConverterParameter=Type}"
FontSize="24"
Foreground="{Binding Converter={StaticResource Converter}, ConverterParameter=Color}"/>
</StackPanel>
</DockPanel>
В MainWindow.xaml
нажатие соответствующей кнопки приводит к выбору конвертера для открывающегося диалога:
<Button x:Name="Red" Content="Красный конвертер" Click="AboutConverter_Click" Margin="10,10,10,10"/>
<Button x:Name="Blue" Content="Синий конвертер" Click="AboutConverter_Click" Margin="10,10,10,10"/>
В MainWindow.xaml.cs
:
private void AboutConverter_Click(object sender, RoutedEventArgs e)
{
if(sender is Button button)
{
switch(button.Name)
{
case "Red":
new AboutConverter(new RedConverter()).ShowDialog();
break;
case "Blue":
new AboutConverter(new BlueConverter()).ShowDialog();
break;
}
}
}
Этот пример взят из Демо.
Раньше: (BindingProxy) Начало: (Обзор) Дальше: (IUniversalConverter)