在我的WPF应用程序中,我有一个DataGrid绑定到viewmodel中的一个集合,但我希望第一列的宽度等于viewmodel本身的属性,如下所示:
public ObservableCollection<Booking> Bookings
{
return repository.Bookings();
}
public int MaxWidth
{
return 100;
}
(我意识到绑定到这样的固定资产没有意义 - 它是用于演示目的)
<UserControl>
<DataGrid DataContext="{Binding Bookings}">
<DataGrid.Columns>
<DataGridTextColumn Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.MaxWidth}" Header="Provider" Binding="{Binding Name}" />
</DataGrid.Columns>
</DataGrid>
</UserControl>
但是,如果我这样做,列的宽度保持默认值 - 即宽度足以容纳其值。
我做错了什么?
编辑:尝试了这一点,看看发生了什么:
<Label Name="tricky" Content="500" Visibility="Collapsed"></Label>
...
<DataGridTextColumn Width="{Binding ElementName=tricky, Path=Content}" Header="Provider" Binding="{Binding Name}" />
哪个什么都没做。是否无法动态设置宽度?
答案 0 :(得分:2)
我认为问题是DataGridTextColum
不是Visual Tree的一部分(可以用Snoop进行验证),因此绑定永远不会得到解决。
从DataGridTextColumn
获取的数据用于构建DataGridCell模板,在构建模板时,DataContext
未设置。
我的建议是使用DataGridTemplateColumn
,并指定您自己的CellTemplate
具有所需的Width
绑定。
答案 1 :(得分:0)
MaxWidth
和Bookings
兄弟姐妹不是吗?所以它们的绑定表达式应该是相同的。
查看您的第一个XAML:Path=DataContext.MaxWidth
- 删除DataContext
查看第二个XAML:无需指定Path
两次,第一个Path
就足够了,我甚至不确定实际构造是否有效。
通常,许多低级UI属性是POCO而不是DP,只需确保您的目标是DP。
更新 - 你可能想要做的是使用FallbackValue = 900
作为绑定表达式的一部分,只是为了缩小问题 - 无论是绑定问题还是目标属性不适合用作绑定目标。
更新2 - 大多数情况下,当您处理管理用户界面的低水平时,您会发现自己很快就会失去动力,创建MVColum通常会有所帮助,管理标题,宽度等并创建一个行为,可以一次性应用所有这些设置。这样,您就不会依赖于目标属性的风格,因为您将在代码中进行设置。
答案 2 :(得分:0)
或者我使用的有用功能如下
IsEnabled="{Binding DataContext.IsEnabled,RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
这允许您链接到网格的itemssource之外的属性。