Установка привязок для столбца шаблона DataGrid для воспроизведения аудио - PullRequest
0 голосов
/ 14 января 2019

У меня есть DataGrid, который показывает набор данных, который содержит имя файла WAV. Я установил этот столбец как столбец «Шаблон», в котором есть кнопка со значком «Воспроизвести», которую пользователь нажимает для воспроизведения звука. При нажатии кнопки значок меняется на значок «Стоп». Все это работает до тех пор, пока пользователь нажимает кнопку, но я ударился о стену, пытаясь добавить сочетание клавиш для «Воспроизвести аудио для текущей строки». - Я могу легко найти элемент данных, найти имя файла и запустить аудио, но не могу найти кнопку для изменения значка.

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

В другом сообщении, которое я видел, говорится об использовании MediaElement ( Как создать сетку данных с wav-файлами в WPF ), но ничего, что я могу найти, ничего не говорит о связывании, поэтому я в конечном итоге столкнулся с той же проблемой - Мне нужно найти элемент управления, чтобы я мог управлять им из кода, что является той же проблемой, что и у меня с кнопками.

Вот упрощенная версия того, что у меня есть:

XAML -

<DataGrid Name="grdAudioData" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <!-- Other columns go here... -->
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Height="25" Width="25" Command="local:AudioGridWindow.PlayAudio" CommandParameter="{Binding}">
                        <Image Source="../icons/Play_16xLGc.png"/>
                    </Button>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

C # Код:

public partial class AudioGridWindow : Window {
  public class LineDataItem {
    /* other data goes here ... */
    public string WavFileName { get; set; }
  }

  private MediaPlayer m_mediaPlayer = new MediaPlayer();
  private Button m_currentlyPlayingButton - null;

  public AudioGridWindow(IList<LineDataItem> lineData) {
    InitializeComponent();
    grdAudioData.ItemsSource = lineData;
  }

  private void OnCommand_PlayAudio(object sender, ExecutedRoutedEventArgs e) {
    Button clickedButton = (Button)e.OriginalSource;
    Button oldButton = m_currentlyPlayingButton;

    // stop any audio that is currently playing
    if(m_currentlyPlayingButton != null) {
      m_mediaPlayer.Stop();
      Image imgStop = new Image();
      imgStop.Source = (BitmapImage)TryFindResource("imgStop");
      m_currentlyPlayingButton .Content = imgStop;
    }

    // If the user clicked a different button than the one that was playing before
    // start new audio
    if(clickedButton != oldButton)
    {
      m_currentlyPlayingButton = clickedButton;
      LineDataItem selectedItem = (LineDataItem)grdAudioData.SelectedItem;

      // Play the audio:
      Uri audioFile = new Uri(selectedItem.WavFileName);
      m_mediaPlayer.Open(audioFile);
      m_mediaPlayer.Play();

      // Change the icon on the play button to "stop"
      Image imgStop = new Image();
      imgStop.Source = (BitmapImage)TryFindResource("imgStop");
      m_currentlyPlayingButton .Content = imgStop;
    }
  }
}

Это работает для нажатия кнопки для воспроизведения аудио - кнопка передается в привязке, поэтому я могу извлечь имя файла из структуры и воспроизвести аудио. Я отслеживаю кнопку, чтобы сменить иконку назад, когда звук останавливается. Я могу легко воспроизвести звук с помощью сочетания клавиш, но не могу изменить значки на кнопках, когда я это делаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...