【问题标题】:Bind DataGrid Column to ViewModel Property将 DataGrid 列绑定到 ViewModel 属性
【发布时间】:2011-04-30 11:21:51
【问题描述】:

如果我有以下 DataGrid,我将如何将 TemplateColumn 的 Visibility 绑定到我的 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}">

我还在我的实际控件中添加了一个按钮,并将其可见性绑定到此属性没有任何困难。

【问题讨论】:

    标签: silverlight


    【解决方案1】:

    在 WPF 中可以实现,但 Silverlight DataGrid 不同。可见性属性不是依赖属性(您不能执行绑定),列不属于 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">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 2011-08-26
      • 1970-01-01
      • 2013-07-27
      • 2014-10-05
      相关资源
      最近更新 更多