我有一个绑定到视图模型的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");
};
}
}
}
有什么想法吗? 感谢
答案 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更改其值。
通过这种方式,您不会违反单一责任规则,并且您可以更灵活,更灵活地解决问题(您可以在其他控件中轻松重复使用)。