菜鸟问题:如何绑定一部分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
前面。
我已经完成了一些非常幼稚的步骤:
- 我尝试使用
Margin.x
或 Margin.X
或...,但这似乎不起作用。
- 我尝试用
Left
替换 Margin
,但这似乎不存在,我没有灵感了。
当 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 他们成功了。
如何引用DataGrid
的Canvas.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 )
我正在 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
前面。
我已经完成了一些非常幼稚的步骤:
- 我尝试使用
Margin.x
或Margin.X
或...,但这似乎不起作用。 - 我尝试用
Left
替换Margin
,但这似乎不存在,我没有灵感了。
当 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 他们成功了。
如何引用DataGrid
的Canvas.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 )