2013-10-26 14 views
5

Tôi có XAML sau:tài sản WPF Bind để sở hữu một yếu tố khác theo tên của phần tử

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

Tôi muốn ràng buộc ListBox s Height 's top Thickness (TabItemsListBox) đến TabItemsList'. Tôi có thể làm như thế nào? thử:

{Binding ElementName=TabItemsList, Path=Height} 

nhưng chương trình của tôi nghiền nát khi tôi chạy nó

+0

hãy thử ActualHeight thay vì Chiều cao – iulian3000

+0

Vẫn nghiền ... – Ron

+0

Đầu là loại Độ dày, đó là lý do tại sao nó nghiền nát, và bạn đang ràng buộc một đôi để thicknes. có thể với sự giúp đỡ của một công cụ chuyển đổi mà bạn gắn vào đầu trang – iulian3000

Trả lời

8

Tôi hy vọng nó hoạt động, bây giờ tôi sử dụng multibinding. Với điều này, bạn phải cung cấp 4 ràng buộc hoặc nó sẽ thất bại, hoặc bạn có thể làm các xét nghiệm của bạn để ngăn chặn bất kỳ lỗi nào trong bộ chuyển đổi.

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> 

Chuyển đổi:

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

gì đang làm phiền tôi nhiều nhất là tôi không nhận được IntelliSense với multibinding. Tôi cũng là một newb :)

+0

Cảm ơn bạn rất nhiều !!! – Ron

+1

Không, cảm ơn bạn vì tôi đã không sử dụng đa kênh bao giờ hết. Bây giờ tôi bây giờ làm thế nào nó hoạt động quá :) – 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> 

và bộ chuyển đổi

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

bài này sais rằng nó hoạt động, liên kết với Lề dưới, nhưng không phải cho tôi . https://stackoverflow.com/a/19454618/1775703

+0

1. Không hoạt động nếu không có trình chuyển đổi. 2. Tôi sửa đổi câu trả lời của bạn để phù hợp với chương trình của tôi và nó đã làm việc nhưng tôi có một vấn đề. bạn trở lại Độ dày và liên kết nó với lề. Tôi muốn ràng buộc chỉ Margin.Top, bởi vì cùng một cách chúng tôi sẽ ràng buộc Margin.Top, tôi sẽ ràng buộc Margin.Right đến một yếu tố khác ... – Ron

+0

Tôi cũng đã xóa Chỉnh sửa của mình trong bài đăng gốc vì tôi đã làm điều gì sai - chuyển đổi gấp đôi thành int mà tôi không cần phải ... – Ron

+0

Vấn đề là Trái, Trên .. không phải là Thuộc tính phụ thuộc, và đó là lý do tại sao tôi không thể liên kết trực tiếp với nó. – iulian3000

Các vấn đề liên quan