通过绑定设置嵌入在窗口中的usercontrol的可操作性

时间:2017-09-06 17:47:33

标签: c# wpf xaml

我有一个绑定到视图模型的Window。该窗口包含多个用户控件。我想将其中一个用户控件的不透明度绑定到在Windows视图模型中公开的属性。

有什么想法吗?

以下是我的XAML片段:

<Window xmlns:Controls="clr-namespace:xxx.UI.Controls"  x:Class="xxx.xxx.UI.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:xxx.xxx.UI"
    xmlns:viewModels="clr-namespace:xxx.xxx.UI.ViewModels;assembly=xxx.xxx.UI.ViewModels"
    mc:Ignorable="d"
    d:DesignHeight="768" 
    d:DesignWidth="1366"
    Title="MCH Anywhere" 
    Icon="Images\Icons\app-icon.ico"
    Height="{Binding SystemParameters.PrimaryScreenHeight}"
    Width="{Binding SystemParameters.PrimaryScreenWidth}"
    WindowState="Maximized">

<Window.DataContext>
    <viewModels:MainWindowViewModel/>
</Window.DataContext>

<Controls:SoundControl x:Name="soundControl" Style="{StaticResource DeviceControlStyle}" Opacity="{Binding Path=SoundControlOpacity}" />

以下是我的窗口视图模型的片段:

public class MainWindowViewModel : IMainWindowViewModel, 
        INotifyPropertyChanged 
{
    public MainWindowViewModel()
    {
        this.SoundControlOpacity = .2;  // binding does not work.
    }

    private double _soundControlOpacity;
    /// <summary>
    /// Gets or sets the opacity of the Ultrasound control.
    /// </summary>
    public double SoundControlOpacity
    {
        get { return _soundControlOpacity; }
        set
        {
            if (value != _soundControlOpacity)
            {
                _soundControlOpacity = value;
                OnPropertyChanged("SoundControlOpacity");
            };
        }
    }
}

有什么想法吗? 感谢

2 个答案:

答案 0 :(得分:5)

这应该有效:

<Controls:SoundControl x:Name="soundControl" Style="{StaticResource DeviceControlStyle}" Opacity="{Binding DataContext.SoundControlOpacity, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}">

答案 1 :(得分:0)

您可以绑定到从祖先控件公开的属性,就像sTrenat解释的那样,但我相信有一种更有效的方法来实现相同的目标。

如果我理解正确,嵌套在Window中的UserControls会有自己的ViewModel,并且它们的实例将保存在WindowViewModel中。在这种情况下,我建议您创建一个包含ControlOpacity属性的类,并在UserControlViewModel中从中派生它。你sholud然后将它绑定到UserControlView中的UserControl的opacity属性(而不是在WindowView中)。然后,您可以通过为UserControlViewModel.ControlOpacity指定值来从UserControlViewModel或WindowViewModel更改其值。

通过这种方式,您不会违反单一责任规则,并且您可以更灵活,更灵活地解决问题(您可以在其他控件中轻松重复使用)。