WPF按钮绑定到属性转换式ImultivalUeconverter不会更新值



我从挂在后面的代码中的切换按钮中具有绑定。我想绑定从一个按钮到4个视频控件的签名状态以切换静音功能。我正在使用多键点将切换按钮绑定到4个不同的控件。我的问题是使用断点,我可以看到所有内容都触发到每个对象上的属性静音属性,但是属性"值"参数永远不会更新。实例化控件时,它停留在默认设置上。

所以首先我在

后面的代码中创建绑定
        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);

这一切似乎都起作用,因为当我单击按钮时,我可以在多价值转换器中看到的正确检查按钮状态到达断点。。

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
}

在这一点上,我可以确认它击中静音属性,并触发集合4次,但是当我跟踪它时,值参数保留在先前的设置值中,并且不会更新以通过通过转换

   // 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个seperat控制播放器并将其绑定到一个按钮的有效方法。

好吧,我再次尝试了几个选项,除了单击按钮事件中的代码

多点根本根本不起作用。我可以看到,在突破点,静音属性被称为4次,用于4个控件,但值参数永远不会更新为新的属性值。

我还尝试将一个按钮绑定到4个不同的控件

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

这只是导致一个播放器对象静音属性。您不能将多个控件绑定到同一按钮。它只是不起作用。

所以我刚刚在单击事件中调用了4个对象。

我相信,在这种情况下,您可能需要将这些4个属性分别绑定到静音属性,并确保每个属性都设置为Twoway。但是,如果多估计逆变器支持它,我不能特别争论您的方法。

看来您尚未为静音介绍依赖性属性。这对于WPF绑定工作流程至关重要,并且倾向于比缩放比NotifyPropertychanged更容易缩放,因为NotifyPropertychanged可能倾向于要求您管理更多。依赖关系将抽象出发送和接收到您的属性的更新,而XAML编辑器的支持更好。

https://learn.microsoft.com/en-us/dotnet/framework/wpf/advanced/how-to-to-ymplement-implement-a-depperency-property-property

我发现WPF的绑定在理论上是不错的,但是仍然需要更多的腿部工作。具有功能。我将其添加到我所有的WPF ViewModels和控件中。

/// <summary>
/// simplify wpf binding
/// </summary>
/// <param name="name"></param>
/// <param name="type"></param>
/// <param name="preferNull">Fair Warning. if you create an instance, you will have also created a singleton of this property for all instances of this class. </param>
/// <returns></returns>
private static DependencyProperty AddDp(string name, Type type, bool preferNull = true)
{
    return DependencyProperty.Register(name, type, typeof(Setting),
        new PropertyMetadata((!preferNull || type.IsValueType) ? Activator.CreateInstance(type) : null));
}

只是从依赖项上继承,您可以使静音看起来更像:

public static readonly DependencyProperty MuteDp = AddDp(nameof(Mute), typeof(bool));
public bool Mute
{
    get => (bool)GetValue(MuteDp);
    set { if(value != Mute) SetValue(MuteDp, value); }
}

但要警告!有时,WPF绑定到依赖项属性会更新依赖关系属性的内部值,而无需输入其相应属性的设置器!在我使用的多杂志上就是这种情况。这意味着它可能永远不会触及静音:: SET登录器。这可能是很有问题的,要解决此问题,您可以使用依赖项的各种回调!

private static DependencyProperty AddDp(string name, Type type, bool preferNull = true)
{
    var dp = DependencyProperty.Register(name, type, typeof(Setting),
        new PropertyMetadata(
            (!preferNull || type.IsValueType) ? Activator.CreateInstance(type) : null
            ,new PropertyChangedCallback((dobj, dpe)=>
            {
                //after property changed.
                //forcing usage of set accessor
                ((MuteContainerObj)dobj).Value = ((strong text)dobj).Value;
                //or forcibly use an update function
                ((MuteContainerObj)dobj).MuteUpdated();
            }),new CoerceValueCallback((dobj, o)=> {
                //before property changed
                return o;
            })), new ValidateValueCallback((o)=> {
                //before property change events
                return true;
            }));
    return dp;
        
}

相关内容

  • 没有找到相关文章

最新更新