Как изменить видимость элементов внутри DataTemplate, если в сетке данных Silverlight выбрана строка? - PullRequest
0 голосов
/ 24 марта 2010

Я использую шаблон MVVM. Я связал свои элементы и хочу показывать кнопку редактирования, только когда в сетке данных выбрана строка. Это представляется возможным с триггерами в WPF, но у нас нет триггеров в Silverlight. Я пробовал привязку TemplatedParent, но я не уверен, что такое TemplatedParent в этом случае. У нас также нет предка RelativeSource в Silverlight. На данный момент я собираюсь посмотреть на решение с использованием кода позади ...

<data:DataGrid.Columns>
   <data:DataGridTemplateColumn IsReadOnly="True" Header="Name" Width="300">
      <data:DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
            <Grid>
               <TextBlock x:Name="textBlock" Text="{Binding Name, Mode=OneWay}" VerticalAlignment="Center" Margin="4,4,0,4"/>
               <Button  Margin="1,1,4,1" HorizontalAlignment="Right" VerticalAlignment="Center" Padding="7,4" Content="Edit" />
            </Grid>
         </DataTemplate>
       </data:DataGridTemplateColumn.CellTemplate>
   </data:DataGridTemplateColumn>
</data:DataGrid.Columns>

Ответы [ 2 ]

1 голос
/ 24 марта 2010

Есть несколько способов сделать это в silverlight, хотя я не думаю, что какой-либо из них может быть чистым XAML-решением. С помощью MVVM вы затем создаете свойство в своей модели представления, которое привязываете к свойству SelectedItem объекта DataGrid. Оттуда есть два разных варианта:

  1. Если отдельные элементы в DataGird сами по себе являются другими моделями представления, вы можете присвоить им свойство, например «IsEditable», и связать его с видимостью кнопки. Когда SelectedItem для родительской ViewModel изменяется, перейдите и обновите свойство IsEditable всех дочерних моделей представления
  2. Если у вас нет дочерних моделей, вы можете обработать загруженное событие кнопки «Изменить». В приведенном ниже коде привяжите видимость кнопки к свойству selecteditem в вашей модели представления, а также настройте преобразователь привязки, который принимает исходный связанный элемент в качестве параметра преобразователя. В конвертере вы можете проверить, равен ли выбранный элемент первоначально привязанному элементу
0 голосов
/ 24 марта 2010

Если бы только Silverlight имел привязку RelativeSource FindAncestor ...

Одной из хакерских идей, которую я мог бы предложить, было бы поместить ваши элементы редактирования в RowDetailsTemplate на самой DataGrid, а затем установить для RowDetailsVisibilityMode значение VisibleWhenSelected.

Возможно, это не то, что вам нужно, но это, вероятно, "решает" ваш конкретный вариант использования.

Если этого не произойдет, то я, вероятно, нарушу MVVM здесь (очень осторожно). Обычно DataGrids - это крайний дочерний случай; они почти все нуждаются в некотором разнообразном коде позади.

...