WPF将xaml UI属性绑定到动态实例控件属性

时间:2019-02-18 11:47:40

标签: c# wpf xaml binding

我有一个自定义媒体播放器对象,该对象是在用户控件后面的代码中创建的。任何时候都可以有1到4个,但是我想将音量和静音属性中的一个绑定到xaml控件EG。

控件为:

MediaControlplayer  vcMediaPlayerMaster = new MediaControlplayer();

在这种情况下,控件的ischecked状态的静音选项不起作用。在后面的代码中实例化控件时,如何将绑定绑定到控件的属性?

xaml就是这样。变量vcMediaPlayerMaster是后面代码中的全局变量。当我实例化它时,我假设它的声明是一个全局预定义变量,将允许下面的xaml绑定到它,但事实并非如此。

<ToggleButton x:Name="btnAudioToggle" ToolTip="Audio Mute/Unmute"  
Click="BtnAudioToggle_OnClick" IsChecked="{Binding Mode =TwoWay, 
ElementName=vcMediaPlayerMaster, Path=Mute}" BorderBrush="LightBlue" 
Width="32" Height="32" Margin="0,5,10,10" Background="{StaticResource 
IbAudio}" Style="{DynamicResource ToggleButtonStyle1}" > </ToggleButton>

我认为也许可以在后面的代码中创建绑定是解决的办法,但是我似乎找不到一个简单的示例来解释执行此操作的代码以适合我的情况。

2 个答案:

答案 0 :(得分:0)

您可以创建一个帮助程序类来保存当前活动的MediaPlayer。
举一个简单的例子:

const exclude = <T>(map: { [k: string]: T }, omitted: string[]): { [k: string]: T } =>
  return Object.getOwnPropertyNames(a)
    .filter(k => omitted.indexOf(k) >= 0)
    .reduce((a, k) => (a[k] = map[k], a), {})
};
var b = exclude(a, ["c"]);

对此的绑定如下所示

public class MediaPlayerHelper : INotifyPropertyChanged
{
    private MediaControlplayer currentPlayer;

    public static MediaPlayerHelper Instance { get; } = new MediaPlayerHelper();

    public MediaControlplayer CurrentPlayer 
    { 
        get => this.currentPlayer;
        set { /* Implement a setter with INotifyPropertyChanged */ }
    }

    // Implement INotifyPropertyChanged here
}

请不要忘记在XAML类的开始标记中包含名称空间:

<Slider Value="{Binding Volume, Source={x:Static helper:MediaPlayerHelper.Instance}}"/>

现在,您只需更改当前使用的MediaPlayer:

xmlns:helper="clr-namespace:SomeNamespace.Helper"

答案 1 :(得分:0)

好吧,我终于明白了。完全在代码后面应用了绑定。 我能够将我想要的属性绑定到按钮的ischecked属性,以切换mediaplayer对象的bool属性

 MediaControlplayer  vcMediaPlayerMaster = new MediaControlplayer();
 Binding myMuteBinding = new Binding("Mute");
 myMuteBinding.Source = vcMediaPlayerMaster;
 myMuteBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
 myMuteBinding.Mode = BindingMode.TwoWay;
 btnAudioToggle.SetBinding(SimpleButton.IsCheckedProperty, myMuteBinding);

所以这对我来说很好,我使用相同的原理来绑定其他属性。