Множественный binding в Margin

203
17 марта 2018, 15:15

Пользователям из интерфейса предлагается выбрать отступы для окна:

<TextBlock Grid.Row="7" Grid.Column="0" HorizontalAlignment="Right" Style="{DynamicResource TextBlockDetailsStyle}" Text="Отступ слева" Visibility="{Binding IsEmpty, Converter={StaticResource InversedBoolToVisibilityConverter}}" />
<extToolkit:IntegerUpDown Grid.Row="7" Grid.Column="1" Margin="2" Maximum="100" Minimum="0" Value="{Binding MarginLeft, UpdateSourceTrigger=PropertyChanged}" Visibility="{Binding IsEmpty, Converter={StaticResource InversedBoolToVisibilityConverter}}" />
<TextBlock Grid.Row="8" Grid.Column="0" HorizontalAlignment="Right" Style="{DynamicResource TextBlockDetailsStyle}" Text="Отступ сверху" Visibility="{Binding IsEmpty, Converter={StaticResource InversedBoolToVisibilityConverter}}" />
<extToolkit:IntegerUpDown Grid.Row="8" Grid.Column="1" Margin="2" Maximum="100" Minimum="0" Value="{Binding MarginTop, UpdateSourceTrigger=PropertyChanged}" Visibility="{Binding IsEmpty, Converter={StaticResource InversedBoolToVisibilityConverter}}" />
<TextBlock Grid.Row="9" Grid.Column="0" HorizontalAlignment="Right" Style="{DynamicResource TextBlockDetailsStyle}" Text="Отступ справа" Visibility="{Binding IsEmpty, Converter={StaticResource InversedBoolToVisibilityConverter}}" />
<extToolkit:IntegerUpDown Grid.Row="9" Grid.Column="1" Margin="2" Maximum="100" Minimum="0" Value="{Binding MarginRight, UpdateSourceTrigger=PropertyChanged}" Visibility="{Binding IsEmpty, Converter={StaticResource InversedBoolToVisibilityConverter}}" />
<TextBlock Grid.Row="10" Grid.Column="0" HorizontalAlignment="Right" Style="{DynamicResource TextBlockDetailsStyle}" Text="Отступ снизу" Visibility="{Binding IsEmpty, Converter={StaticResource InversedBoolToVisibilityConverter}}" />
<extToolkit:IntegerUpDown Grid.Row="10" Grid.Column="1" Margin="2" Maximum="100" Minimum="0" Value="{Binding MarginDown, UpdateSourceTrigger=PropertyChanged}" Visibility="{Binding IsEmpty, Converter={StaticResource InversedBoolToVisibilityConverter}}" />

Как лучше связать MarginLeft, MarginTop и.т.д со свойством Margin. Не напишешь же Margin = "{Binding MarginLeft} {Binding MarginTop} {Binding MarginRight} {Binding MarginDown}"

Answer 1

Напишите такой мультиконвертер:

class MarginConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var left = (int)values[0];
        var top = (int)values[1];
        var right = (int)values[2];
        var bottom = (int)values[3];
        return new Thickness(left, top, right, bottom);
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

И используйте:

<Grid Margin="5">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <UniformGrid Columns="2">
        <TextBlock Text="Слева:"/>
        <TextBox Text="{Binding Left}"/>
        <TextBlock Text="Сверху:"/>
        <TextBox Text="{Binding Top}"/>
        <TextBlock Text="Справа:"/>
        <TextBox Text="{Binding Right}"/>
        <TextBlock Text="Снизу:"/>
        <TextBox Text="{Binding Bottom}"/>
    </UniformGrid>
    <Border Grid.Row="10" BorderThickness="1" BorderBrush="Red">
        <Border.Resources>
            <c:MarginConverter x:Key="conv"/>
        </Border.Resources>
        <Border BorderBrush="Green" BorderThickness="1">
            <Border.Margin>
                <MultiBinding Converter="{StaticResource conv}">
                    <Binding Path="Left"/>
                    <Binding Path="Top"/>
                    <Binding Path="Right"/>
                    <Binding Path="Bottom"/>
                </MultiBinding>
            </Border.Margin>
        </Border>
    </Border>
</Grid>

READ ALSO
Запуск анимации из фонового потока(2)

Запуск анимации из фонового потока(2)

Благодаря VladD, который ответил мне в прошлый раз здесь - Проигрывание анимации из фонового потока , а также куче различных тем на других форумах,...

222
Использование Firebase в c#

Использование Firebase в c#

Как можно моментально отправлять данные в FireBase?

233
Разбор async await [дубликат]

Разбор async await [дубликат]

На данный вопрос уже ответили:

252
C# Как освободить ресурсы из Picturebox?

C# Как освободить ресурсы из Picturebox?

Здравствуйте, как правильно открывать файл в pictureBox и правильно закрывать его для перезаписывания файла

243