Как отображать кнопку, только когда выбрана строка Silverlight DataGrid

Как я могу отобразить кнопку в DataGridTemplateColumn, только если ее строка выбрана? Я пробовал это, но, конечно, IsSelected мне недоступны. Нет смысла иметь свойство IsSelected для объекта, к которому привязаны строки, и даже в этом случае я бы не хотел, чтобы мне пришлось так сильно связывать свой DataGrid с моей моделью. Может ли интерфейс справиться с этим сам?

Вот что у меня есть:

<sdk:DataGrid Name="_categorySummaryDataGrid" 
              MinHeight="200" 
              ItemsSource="{Binding ElementName=_userControl, Path=CategorySummaries}"
              AutoGenerateColumns="False" RowDetailsVisibilityMode="VisibleWhenSelected">
    <sdk:DataGrid.Columns>
        <sdk:DataGridTextColumn x:Name="_nameColumn" Binding="{Binding Path=Name}" Header="Name" Width="Auto" IsReadOnly="True" />
        <sdk:DataGridTextColumn x:Name="_descriptionColumn" Binding="{Binding Path=Description}" Header="Description" Width="*" IsReadOnly="True" />
        <sdk:DataGridTemplateColumn x:Name="_detailsColumn" Width="Auto">
            <sdk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Content="..." ToolTipService.ToolTip="View Category Details" 
                            Visibility="{Binding Path=IsSelected, Converter={StaticResource BooleanToVisibility}}"/>
                </DataTemplate>
            </sdk:DataGridTemplateColumn.CellTemplate>
        </sdk:DataGridTemplateColumn>
    </sdk:DataGrid.Columns>
</sdk:DataGrid>

По соображениям дизайна я хочу, чтобы кнопка отображалась только тогда, когда выбрана содержащая ее строка. И, если возможно, я хочу, чтобы при наведении курсора на строку отображалось по-другому.

Похоже, что у Silverlight и WPF больше ограничений, на которые я надеялся. Я надеюсь, что это возможно. Спасибо. :)

Изменить:

У меня нет и не будет Expression Blend. Спасибо, вот и все.


person Jordan    schedule 18.02.2011    source источник


Ответы (1)


Всякий раз, когда вы хотите изменить внешний вид чего-либо в Silverlight, вы должны думать в терминах VisualStateManager. Чтобы изменить внешний вид выбранной ячейки DataGrid, вам нужно воспользоваться чудесами VSM. Редактируя состояние DataGridColumn.CellStyle «Selected», вы можете изменить внешний вид выбранной ячейки сетки.

  1. В Blend перетащите новый DataGrid на страницу.
  2. Щелкните правой кнопкой мыши DataGrid и выберите «Добавить столбец -> Добавить столбец DataGridTemplateColumn».
  3. Щелкните правой кнопкой мыши DataGridTemplateColumn на панели «Объект и временная шкала» и выберите «Изменить стили столбца -> Изменить стиль ячеек -> Изменить копию».
  4. Щелкните правой кнопкой мыши «Стиль» на панели «Объекты и временная шкала» и выберите «Редактировать шаблон -> Изменить текущий».
  5. Теперь самое интересное, как конкретно решить проблему с исчезающей кнопкой. Если кнопка - это единственное, что у вас есть в этом CellTemplate, вы можете просто скрыть все содержимое ячейки.
  6. Выберите состояние «Выбрано» на панели «Состояния».
  7. Установите видимость ContentPresenter в CellStyle.Template на Collapsed. (Более приятным UX было бы добавить анимацию длительностью 0,3 секунды с изменением непрозрачности от 100% до 0%).

По сути, весь этот учебник посвящен переходу к CellStyle.Template для вашего DataGridColumn и добавлению анимации к выбранному состоянию.

person JustinAngel    schedule 18.02.2011
comment
Я программист, а не дизайнер. У меня нет и я не буду тратить 600 долларов на Expression Blend. Спасибо за помощь, но мне нужно знать, как это сделать прямо на металле. Я не хочу показаться грубым. Я просто устал от необходимости постоянно покупать очередной инструмент Microsoft. Я люблю big-M, но у большинства из нас нет такой финансовой поддержки. - person Jordan; 18.02.2011
comment
Извините, я знаю, что вы просто пытались помочь. Спасибо. - person Jordan; 18.02.2011
comment
@Jordan, Не использовать Blend для разработки Silverlight - это безумие и сделает вашу жизнь невыносимо сложной для простых задач, подобных этой. Вы определенно упускаете и не доводите Silverlight до 10% от установленного лимита, если вы держите себя запертым в месте, где вы выполняете XAML только вручную. Написав XAML вручную, вы не приблизитесь к цели, точно так же, как кодирование C # в Блокноте не приблизит вас к CLR. - person JustinAngel; 18.02.2011
comment
Хорошо, я думаю, мне придется здесь стиснуть зубы. Blend - единственное, что мне нужно для создания пользовательских интерфейсов, или вы бы порекомендовали весь пакет? - person Jordan; 18.02.2011
comment
Шаблоны для встроенных элементов управления доступны в MSDN. Для получения шаблона не требуется Blend. - person Tom A; 30.07.2012