将DataGrid列绑定到ViewModel属性

时间:2010-10-25 21:58:40

标签: silverlight

如果我有以下DataGrid,我将如何将TemplateColumn的可见性绑定到我的ViewModel上的属性?我在这里的代码是基于SO Question的推荐,但没有运气。

            <sdk:DataGrid Visibility="{Binding GridVisible}" DataContext="{Binding}" Grid.Row="1" ItemsSource="{Binding Path=BookSource}" x:Name="bookGrid" AutoGenerateColumns="False" IsReadOnly="True">
                <sdk:DataGrid.Columns>
                    <sdk:DataGridTemplateColumn Visibility="{Binding Path=DataContext.GridImgColumnVisible, ElementName=bookGrid}">
                        <sdk:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Image Stretch="Fill" Source="{Binding Path=SmallImgURI}"></Image>
                            </DataTemplate>
                        </sdk:DataGridTemplateColumn.CellTemplate>
                    </sdk:DataGridTemplateColumn>

                    <sdk:DataGridTextColumn Header="Title"  Width="*"  Binding="{Binding CurrentBook.Title}" />
                    <sdk:DataGridTextColumn Header="Published" Width="150"  Binding="{Binding CurrentBook.Published, StringFormat=d}" />
                </sdk:DataGrid.Columns>
            </sdk:DataGrid>

编辑 - 我也尝试过:

<sdk:DataGridTemplateColumn Visibility="{Binding Path=DataContext.GridImgColumnVisible, ElementName=root}">

我还为我的实际控件添加了一个按钮,并将其可见性限制在此属性中。

1 个答案:

答案 0 :(得分:3)

可以在WPF中实现,但Silverlight DataGrid是不同的。 Visibility属性不是依赖项属性(不能执行绑定),列不属于VisualTree,也不继承DataContext。

使用代码隐藏,如下所示:

var model = (MyViewModel)this.DataContext;
model.PropertyChanged += (s,e) => 
{
    if(e.PropertyName == "GridImgColumnVisible")
        this.UpdateGridColumnVisibility(model.GridImgColumnVisible);
};

public void UpdateGridColumnVisibility(Visibility imageVisibility)
{
    var imgColumn = bookGrid.Columns.Cast<DataGridColumn>().FirstOrDefault(c => ((string)c.GetValue(Panel.NameProperty)) == "imgColumn");
    if(imgColumn != null)
        imgColumn.Visibility = imageVisibility;
}

并将名称添加到列中:

<sdk:DataGridTemplateColumn x:Name="imgColumn">