我有两个datagrids,每个都有一列。 第一:
<DataGrid.Columns>
<DataGridTextColumn x:Name="FilterTextCol01"
IsReadOnly="False"
Width="{Binding ElementName=TextCol01, Path=ActualWidth, Mode=TwoWay}" />
</DataGrid.Columns>
第二
<DataGridTextColumn CellStyle="{StaticResource DataGridColumnContentLeft}"
local:DataGridUtil.Name="TextCol01"
x:Name="TextCol01"
Header="TextCol01"
SortMemberPath="TextCol01"
Binding="{Binding TextCol01}"
Width="Auto"
IsReadOnly="True"/>
第一列宽度与第二列宽度的绑定不起作用。 如果我在代码中这样做:
FilterTextCol01.Width = TextCol01.ActualWidth;
有效。 谁能告诉我为什么第一种方法不起作用?
答案 0 :(得分:14)
因为DataGrid
列是抽象对象,不出现在窗口的逻辑或可视树中。您无法使用ElementName
绑定它们的属性(这些绑定不需要名称范围)。
您可以尝试使用Source
和x:Reference
代替,例如
{Binding Source={x:Reference TextCol01}, Path=ActualWidth}
答案 1 :(得分:1)
H.B.说这个属性不在逻辑或可视树中。
另请参阅基于绑定代理的此方法。
<强>源码强>
<DataGrid ItemsSource="{Binding Lines}" AutoGenerateColumns="False" >
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}"/>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="ProductId1" Binding="{Binding Path=Result[0]}" Width="{Binding Data.Columns[0].Width, Source={StaticResource proxy}, Mode=TwoWay}" />
<DataGridTextColumn Header="ProductId2" Binding="{Binding Path=Result[1]}" Width="{Binding Data.Columns[1].Width, Source={StaticResource proxy}, Mode=TwoWay}"/>
</DataGrid.Columns>
</DataGrid>
class BindingProxy : Freezable
{
//Override of Freezable
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
}
public object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
public static readonly DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}
public class Column : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected internal void OnPropertyChanged(string propertyname)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyname));
}
public DataGridLength Width
{
get { return m_width; }
set { m_width = value; OnPropertyChanged("Width"); }
}
DataGridLength m_width;
}
答案 2 :(得分:0)
我一直在寻找这样的东西。我找到了一个解决方案,所以我发布它是为了帮助其他人解决同样的问题。
在我的实现中,我使用Custom DataTemplate作为DataGridTextColumn的标题!!
因此,将Width="{Binding ActualWidth, RelativeSource={RelativeSource Mode=TemplatedParent}}"
分配给用作DataGridColumnHeader的TextBlock
,我可以将Width
设置为DataGridTextColumn
ActualWidth