Привязать столбец DataGrid к свойству ViewModel - PullRequest
0 голосов
/ 26 октября 2010

Если у меня есть следующая DataGrid, как я могу связать видимость TemplateColumn со свойством в моей модели представления? Код, который я здесь привел, основан на рекомендации из этого ТАКого вопроса , но не повезло.

            <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 Ответ

3 голосов
/ 26 октября 2010

Это может быть достигнуто в 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">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...