2013-10-26 10 views
5

Ho il seguente XAML:WPF Bind immobili ad un'altra proprietà elemento in base al nome dell'elemento

<Grid KeyboardNavigation.TabNavigation="Local" SnapsToDevicePixels="True"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <Border Background="Transparent" BorderThickness="0,0,0,2" BorderBrush="{StaticResource TabPanelBorderBrush}"> 
      <DockPanel LastChildFill="True"> 
       <Button x:Name="LeftButton" Content="3" DockPanel.Dock="Left" Style="{DynamicResource TabControlButton}"></Button> 
       <StackPanel Orientation="Horizontal" DockPanel.Dock="Right"> 
        <Button x:Name="RightButton" Content="4" Style="{DynamicResource TabControlButton}"></Button> 
        <Button x:Name="TabItemsList" Content="L" FontFamily="Segoe UI" Style="{DynamicResource TabControlButton}"></Button> 
        <Button x:Name="AddTabItem" Content="+" FontFamily="Segoe UI" Style="{DynamicResource TabControlButton}"></Button> 
       </StackPanel> 
       <ScrollViewer x:Name="ScrollViewer" VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Hidden"> 
        <TabPanel x:Name="HeaderPanel" IsItemsHost="True" Panel.ZIndex="1" KeyboardNavigation.TabIndex="1"/> 
       </ScrollViewer> 
      </DockPanel> 
     </Border> 
     <Border Grid.Row="1" Background="{StaticResource TabControlBackground}"/> 
     <ContentPresenter Grid.Row="1" Name="PART_SelectedContentHost" ContentSource="SelectedContent"/> 
    </Grid> 
    <ListBox x:Name="TabItemsListBox" Width="200" Height="200" HorizontalAlignment="Right" VerticalAlignment="Top" Visibility="Collapsed"> 
     <ListBox.Margin> 
      <Thickness Left="0" Top="{Binding to TabItemsList height}" Right="0" Bottom="20"/> 
     </ListBox.Margin> 
    </ListBox> 
</Grid> 

voglio di impegnare la ListBox s Height 's top Thickness (TabItemsListBox) al TabItemsList'. Come posso farlo? provato:

{Binding ElementName=TabItemsList, Path=Height} 

ma il mio programma schiaccia quando l'eseguo

+0

provare ActualHeight invece di Height – iulian3000

+0

Still crushes ... – Ron

+0

Top is typeof Thickness, ecco perché si schiaccia, e si sta legando un doppio a thicknes. forse con l'aiuto di un convertitore si può legare a Top – iulian3000

risposta

8

Spero che funzioni, ora uso il multibinding. Con questo è necessario fornire 4 associazioni o fallirà, oppure è possibile fare i test per prevenire eventuali errori nel convertitore.

Xaml:

<ListBox x:Name="TabItemsListBox" 
      Width="50" 
      Height="50"> 
     <ListBox.Margin> 
      <MultiBinding Converter="{StaticResource Converter}"> 
       <MultiBinding.Bindings> 
        <Binding ElementName="TabItemsListBox" 
          Path="ActualHeight" /> 
        <Binding ElementName="TabItemsListBox" 
          Path="ActualHeight" /> 
        <Binding ElementName="TabItemsListBox" 
          Path="ActualHeight" /> 
        <Binding ElementName="TabItemsListBox" 
          Path="ActualHeight" /> 
       </MultiBinding.Bindings> 
      </MultiBinding> 
     </ListBox.Margin> 
    </ListBox> 

Converter:

public class DoubleToMarginConverter : IMultiValueConverter 
{ 

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var left = (double)values[0]; 
     var top = (double)values[1]; 
     var right = (double)values[2]; 
     var bottom = (double)values[3]; 

     return new Thickness(left, top, right, bottom); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Quello che mi dà fastidio di più è che io non ottenere intellisense con MultiBinding.

+0

Grazie mille !!! – Ron

+1

No, malato grazie perché non ho mai usato il multibinding. Ora ora come funziona anche :) – iulian3000

2
<ListBox x:Name="TabItemsListBox" 
      Width="200" 
      Height="200" 
      HorizontalAlignment="Right" 
      VerticalAlignment="Top" 
      Visibility="Visible" 
      Margin="{Binding ElementName=TabItemsListBox, Path=ActualHeight , Converter={StaticResource Converter}}" 
      > 
     <ListBoxItem> 
      <Button Content="Button" /> 
     </ListBoxItem> 

    </ListBox> 

e il convertitore

public class DoubleToTopMarginConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var top = (double)value; 

     return new Thickness(0, top, 0, 20); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
    } 

Questo post sais che funziona, il legame con il margine inferiore, ma non per me . https://stackoverflow.com/a/19454618/1775703

+0

1. Non funziona senza convertitore. 2. Ho modificato la risposta in modo che corrisponda al mio programma e ha funzionato, ma ho un problema. si restituisce spessore e si lega al margine. Voglio legare solo il Margin.Top, perché allo stesso modo legheremo il Margin.Top, legherò il Margin.Right su un altro elemento ... – Ron

+0

Ho anche rimosso il mio Edit nel post originale da quando ho fatto qualcosa di sbagliato - convertito double in int che non ho avuto bisogno di ... – Ron

+0

Il problema è che a sinistra, in alto .. non sono proprietà di dipendenza, e questo è il motivo per cui non posso legarlo direttamente ad esso. – iulian3000