菜鸟问题:如何绑定一部分Margin 属性

Newbie question: how to bind to a part of the Margin property

我正在 WPF 绑定中迈出第一步,我想绑定两个可视组件:一个 DataGrid 和一个 Label,后者要放在另一个之上(不是在它前面,我是说)。

这是我目前拥有的:

<DataGrid x:Name="dg_SomeTable" HorizontalAlignment="Left" Height="auto"
       Margin="10,26,0,0" VerticalAlignment="Stretch" Width="74"/>
<Label Content="SomeTable" HorizontalAlignment="Left" Margin="10,0,0,0"
       VerticalAlignment="Top" 
       Width="{Binding Path=ActualWidth, ElementName=dg_SomeTable}"/>

如您所见,Label 的宽度受限于 DataGrid 的宽度。
这已经很有用了,但我想更进一步,不仅要绑定宽度,还要绑定 X 坐标。

我相信 X 坐标是 Margin 属性 的第一个条目,但我不能简单地绑定到整个 属性,因为这会放置我的Label 在我的 DataGrid 前面。

我已经完成了一些非常幼稚的步骤:

当 X 坐标的定义嵌入在 Margin [= 中时,有人知道将一个视觉组件的 X 坐标绑定到另一个视觉组件的 X 坐标的好方法吗? 74=]?

哦,我检查了 this similar question 但这涉及实际编程,我想知道是否有一个简单的 XAML 解决这个看似基本的问题。

评论后编辑,求更多信息:

大体上我的XAML是这样的:

<TabControl ...
    <TabItem ...
        <Grid ...
            <DataGrid x:Name="dg_SomeTable" ... Margin=... />
            <Label Content="SomeTable" ... />

按照建议,应将其替换为:

<TabControl ...
  <TabItem ...
    <Canvas ...
      <DataGrid x:Name="dg_SomeTable" Width="222" Canvas.Left="10" ...
      <Label Content="SomeTable"
             Canvas.Left="{Binding Path=Left, 
                           RelativeSource={RelativeSource FindAncestor, 
                                           AncestorType={x:Type Canvas}}}"
             Width="{Binding Path=ActualWidth,
                     ElementName=dg_Locations}"/>

我已经能听到你的反应“现在你指的是 Canvas 的左侧,而你应该指的是 Canvas.Left DataGrid".
嗯,我试过这些:

Canvas.Left="{Binding Path=Canvas.Left, ElementName=dg_SomeTable}"
Canvas.Left="{Binding Path=Left, ElementName=dg_SomeTable}"

None 他们成功了。

如何引用DataGridCanvas.Left

How can I refer to the Canvas.Left of the DataGrid?

像这样(注意附加的 属性 名称周围的括号):

Canvas.Left="{Binding Path=(Canvas.Left), ElementName=dg_SomeTable}"

使用转换器

第一步。制作转换器


    public class MarginConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (!(value is Thickness)) return new Thickness(0, 0, 0, 0);

            Thickness gridMargin = (Thickness)value;

            return new Thickness(gridMargin.Left, 0,0,0);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return parameter;
        }
    }

第二步。添加到资源

    <Window.Resources>
        <local:MarginConverter x:Key="MarginConverter"/>
    </Window.Resources>

第三步。将保证金与转换器绑定

<Label Content="SomeTable" HorizontalAlignment="Left" 
   VerticalAlignment="Top" 
   Width="{Binding Path=ActualWidth, ElementName=dg_SomeTable}"
   Margin="{Binding Margin, ElementName=dg_SomeTable, Converter= {StaticResource MarginConverter}}"/>

此转换器获得 dg_SomeTable 的保证金和 return 新保证金 ( dg_table 的 Margin.Left, 0 , 0, 0 )