【问题标题】:WPF binding xaml UI property to dynamic instance control propertyWPF 将 xaml UI 属性绑定到动态实例控件属性
【发布时间】:2019-07-11 19:09:40
【问题描述】:

我有一个自定义媒体播放器对象,它是在用户控件后面的代码中创建的。任何时候都可以有 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>

我认为也许在代码后面创建一个绑定可能是要走的路,但我似乎找不到一个简单的例子来解释代码背后的过程来适应我的情况。

【问题讨论】:

  • 你能分享你的整个代码示例吗?

标签: c# wpf xaml binding


【解决方案1】:

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

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
}

与 this 的绑定如下所示

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

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

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

现在您只需在当前使用的 MediaPlayer 发生变化时对其进行更改:

MediaPlayerHelper.Instance.CurrentPlayer = newCurrentPlayer;

【讨论】:

  • 我想这是一种可能性,但我认为有一种方法可以直接在代码中绑定到 xaml 控件,我认为这可能更快更干净。
  • 直接绑定xaml控件是什么意思?
  • 我的意思是在后面的代码中创建一个新的绑定,例如 Binding myBinding = new Binding();但我试过的例子似乎都没有。我也只是假设在播放器对象被实例化后在后面的代码中创建它将允许人们以这种方式直接连接绑定,而不是使用这个辅助类方法。
  • 在后面的代码中像这样绑定它应该可以工作。也许将您用于绑定的代码添加到问题中以检查您做错了什么或为它打开一个新问题。恕我直言,绑定到这样的助手比更改后面代码中的绑定更干净。
【解决方案2】:

好吧,我终于让它工作了。完全应用了代码中的绑定。 我能够将我想要的属性绑定到按钮的 ischecked 属性以切换媒体播放器对象的 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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    相关资源
    最近更新 更多