Связывание из нескольких элементов в wpf - PullRequest
1 голос
/ 21 июня 2010

У меня есть 3 имени элемента управления wpf "A" "B" "C".Я хочу связать C контроль height.

Легко понять: C.Height=A.Height+B.Height

Это моя мечта.:)

< C >
 < C.Height >
  < SumBinding >
    < Binding ElementName=A, Path=Height/ >
    < Binding ElementName=B, Path=Height/ >
  < /SumBinding >
 < /C.Height >
< /C >

Как это сделать?

Можно ли не использовать конвертер?

В противном случае можно создать SumBinding подобный класс?

1 Ответ

5 голосов
/ 21 июня 2010

Вы можете привязать свойство к нескольким привязкам, используя MultiBinding , хотя вам потребуется использовать конвертер, реализующий IMultiValueConverter , чтобы использовать их.В этом случае вы, вероятно, захотите привязать к Height, а не к ActualHeight, чтобы получить значение после выполнения макета.

Вы бы определили конвертер так:

public class SumConverter
    : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return values.Cast<double>().Sum();
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        return null;
    }
}

И затем сделайте что-то подобное в XAML:

<Control Name="C">
    <Control.Resources>
        <local:SumConverter x:Key="SumConverter"/>
    </Control.Resources>
    <Control.Height>
        <MultiBinding Converter="{StaticResource SumConverter}">
            <Binding Path="ActualHeight" ElementName="A" />
            <Binding Path="ActualHeight" ElementName="B" />
        </MultiBinding>
    </Control.Height>
</Control>

Если вы просто пытаетесь получитьВысота элементов управления должна быть в фиксированном соотношении друг с другом, вы можете использовать сетку со звездообразным размером или несколько сеток с общими группами размеров.Примерно так может работать:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="2*"/>
    </Grid.RowDefinitions>
    <Button Grid.Row="0">A</Button>
    <Button Grid.Row="1">B</Button>
    <Button Grid.Row="2">C</Button>
</Grid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...