WPF DataGrid - 将源和宽度绑定到不同的对象

时间:2014-03-24 14:46:15

标签: c# wpf mvvm datagrid

在我的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}" />

哪个什么都没做。是否无法动态设置宽度?

3 个答案:

答案 0 :(得分:2)

我认为问题是DataGridTextColum不是Visual Tree的一部分(可以用Snoop进行验证),因此绑定永远不会得到解决。

DataGridTextColumn获取的数据用于构建DataGridCell模板,在构建模板时,DataContext未设置。

我的建议是使用DataGridTemplateColumn,并指定您自己的CellTemplate具有所需的Width绑定。

答案 1 :(得分:0)

MaxWidthBookings兄弟姐妹不是吗?所以它们的绑定表达式应该是相同的。

查看您的第一个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之外的属性。