Привязка кнопки WPF к свойству Convertback IMultiValueConverter не обновляет значение - PullRequest
0 голосов
/ 14 марта 2019

У меня есть привязка от переключателя, подключенного в коде сзади. Я хочу связать состояние isChecked от одной кнопки до 4 элементов управления видео, чтобы включить функцию отключения звука. Я использую мультисвязывание, чтобы привязать кнопку переключения к 4 различным элементам управления. Моя проблема заключается в использовании точек останова. Я вижу, что все запускается вплоть до свойства mute свойства каждого объекта, но параметр свойства value никогда не обновляется. При создании элементов управления остается значение по умолчанию.

Итак, сначала я создаю привязки в коде

        IMultiValueConverter converter = new EmptyMultiValueConverter();
        MultiBinding myMultiBinding = new MultiBinding();
        myMultiBinding.Converter = converter;
        myMultiBinding.UpdateSourceTrigger = UpdateSourceTrigger.Default;
        myMultiBinding.Mode = BindingMode.OneWayToSource;      
        myMultiBinding.NotifyOnSourceUpdated = true;  



        for (int i = 1; i < _maxNumberofPlayers; i++)
        {
            VideoPlayer player = new VideoPlayer()
            {
                Mute = false
            };

          myMultiBinding.Bindings.Add(new Binding("Mute") { Source = player 
         });

        }


     btnMuteToggle.SetBinding(SimpleButton.IsCheckedProperty, myMultiBinding);

Кажется, все это работает, потому что, когда я нажимаю на кнопку, которую вижу в многозначном конвертере, правильное состояние кнопки isChecked приходит к точкам останова, в ConvertBack ниже я могу подтвердить, что это правильное значение bool, отражающее состояние кнопки переключения .

public class EmptyMultiValueConverter : IMultiValueConverter
{
    #region IMultiValueConverter Members

    public object Convert(object[] values, Type targetType, object 
    parameter, System.Globalization.CultureInfo culture)
    {
        // gets from the object source
        return (bool)values[0];
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object 
   parameter, System.Globalization.CultureInfo culture)
    {

        return new Object[] {value,value,value,value};
    }

    #endregion
}

В этот момент я могу подтвердить, что он обращается к свойству Mute и запускает SET 4 раза, но когда я прослеживаю его, параметр значения остается на ранее установленном значении и не обновляется, чтобы отразить значение, переданное ему через ConvertBack

   // mute property in the media player user control
    public bool Mute
    {
        get { return  _media.IsMuted; }
        set
        {       
            if (_media.IsMuted == value)
                return;
            else
            {
                _media.IsMuted = value;
                NotifyPropertyChanged("Mute");
            }

        }
    }

Может кто-нибудь помочь, пожалуйста. Вырвали мои волосы в течение 3 дней.

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

1 Ответ

0 голосов
/ 15 марта 2019

хорошо, я попробовал несколько вариантов снова, и ни один из них не работает, кроме кода в событии нажатия кнопки

Multibinding просто не работает вообще. В точках останова я вижу, что свойство Mute вызывается 4 раза для 4 элементов управления, но параметр value никогда не обновляется до нового значения свойства.

Я также пытался привязать одну кнопку к 4 различным элементам управления

foreach(Player player in lsPlayers)
{
    btnMuteToggle.SetBinding(SimpleButton.IsCheckedProperty, new Binding("Mute")
       {
         Source = player,
         UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
         Mode = BindingMode.OneWayToSource
        });
}

Это просто приводит к тому, что вызывается свойство отключения одного объекта игрока. Вы не можете привязать более одного элемента управления к одной и той же кнопке. Это просто не работает.

поэтому я просто вызвал 4 объекта в событии щелчка.

...