我从挂在后面的代码中的切换按钮中具有绑定。我想绑定从一个按钮到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;
}