2013-10-26 1 views
5

Ich habe folgende XAML:WPF Bind-Eigenschaft auf ein anderes Element Eigenschaft von dem Namen des Elements

<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> 

Ich möchte die ListBox 's top Thickness (TabItemsListBox) auf die TabItemsList' s Height binden. Wie kann ich das tun? versucht:

{Binding ElementName=TabItemsList, Path=Height} 

aber mein Programm zermalmt, wenn ich es laufen

+0

versuchen ActualHeight statt Höhe – iulian3000

+0

Noch zerkleinert ... – Ron

+0

Top ist Typof Dicke, das ist, warum es zerkleinert, und Sie binden ein doppelt zu dick. vielleicht mit Hilfe eines Konverters Sie cond binden an Top – iulian3000

Antwort

8

Ich hoffe, es funktioniert, jetzt verwende ich Multibinding. Damit müssen Sie 4 Bindungen bereitstellen oder es wird fehlschlagen, oder Sie können Ihre Tests durchführen, um Fehler im Konverter zu vermeiden.

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(); 
    } 
} 

Was stört mich am meisten, dass ich mit mehrbindigen erhalten Intellisense nicht. Ich bin ein Newb auch :)

+0

Vielen Dank !!! – Ron

+1

Nein, krank danke, weil ich noch nie Multibinding benutzt habe. Jetzt geht es mir jetzt auch so :) – 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> 

und der Konverter

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(); 
    } 
    } 

Dieser Beitrag sais, dass es funktioniert, bis Unterer Rand zu binden, aber nicht für mich . https://stackoverflow.com/a/19454618/1775703

+0

1. Nicht ohne Konverter funktioniert. 2. Ich habe Ihre Antwort so geändert, dass sie zu meinem Programm passt, und es hat funktioniert, aber ich habe ein Problem. Sie geben Dicke zurück und binden sie an den Rand. Ich möchte nur das Margin.Top binden, denn auf die gleiche Weise werden wir das Margin.Top binden, ich werde das Margin.Right an ein anderes Element binden ... – Ron

+0

Ich habe auch meinen Edit im ursprünglichen Post entfernt, da ich etwas falsch gemacht habe - konvertierte double to int, die ich nicht brauchte ... – Ron

+0

Das Problem ist, dass Left, Top .. sind nicht Abhängigkeitseigenschaften, und das ist, warum ich nicht direkt binden kann. – iulian3000