C# 从装饰器绑定到基础ViewModel

C# 从装饰器绑定到基础ViewModel,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我在一个名为OpacityAdorner的装饰器中创建了一个滑块控件,用于控制它所属控件的不透明度。我遵循了Adorner示例,在该示例中,使用xaml样式来帮助形成Adorner,这可能会增加一点复杂性。 目前,我能找到的唯一方法是将滑块的ValueChange挂接到ViewModel中,这似乎有点粗糙,我更喜欢绑定。但我还是不太明白: protected override void OnInitialized( System.EventArgs e ) { base.

我在一个名为OpacityAdorner的装饰器中创建了一个滑块控件,用于控制它所属控件的不透明度。我遵循了Adorner示例,在该示例中,使用xaml样式来帮助形成Adorner,这可能会增加一点复杂性。 目前,我能找到的唯一方法是将滑块的ValueChange挂接到ViewModel中,这似乎有点粗糙,我更喜欢绑定。但我还是不太明白:

protected override void OnInitialized( System.EventArgs e )
    {
        base.OnInitialized( e );

        if( m_chrome != null && m_chrome.Template != null && m_slider == null )
        {
            m_chrome.ApplyTemplate();
            m_slider = m_chrome.Template.FindName( "OpacitySlider", m_chrome ) as Slider;
            if( m_slider != null )
            {
                m_slider.ValueChanged += opacity_value_changed;
                //Binding opacityBinding = new Binding( "OpacityValue" );
                //Control ctrl = (Control)m_chrome.DataContext;
                //SettingsViewModel settingsVM = ctrl.DataContext as SettingsViewModel;
                //opacityBinding.Source = settingsVM;
                //////opacityBinding.Path = new PropertyPath( "OpacitySlider" );
                //m_slider.SetBinding( SettingsViewModel.OpacticyProperty, opacityBinding );
            }
            m_opacity_button = m_chrome.Template.FindName( "OpacitySliderEnable", m_chrome ) as Ellipse;
            if( m_opacity_button != null )
            {
                m_opacity_button.PreviewMouseLeftButtonDown += m_opacity_button_MouseLeftButtonDown;
            }
        }           
    }

void opacity\u值\u已更改(对象发送方,RoutedPropertyChangedEventArgs e)
{
Control ctrl=(Control)m_chrome.DataContext;
SettingsViewModel settingsVM=ctrl.DataContext作为SettingsViewModel;
设置SVM.OpacityValue=e.NewValue;
}

理想情况下,我只想让绑定在注释掉的部分工作,删除不透明度\u值\u更改事件。我还想知道是否有一种更简洁的方法来检索SettingsViewModel,而不必首先获取容器chrome控件,然后从其DataContext获取视图模型?

根据MVVM,您的视图必须不知道视图模型是什么类型的。因此,您不应该将类似于
DataContext的内容编写为ViewModel
。考虑检查绑定。并且,发布您的XAML标记。@dymanoid我不同意。从您执行
{Binding SomeProperty}
的那一刻起,视图就会自动感知ViewModel。此外,您的声明还暗示应该使用复杂、过度工程化、通常完全不需要的东西,例如为viewmodel创建接口,并使用DI将实例注入视图,这对于简单场景来说完全是胡说八道。我完全不同意你的说法。@HighCore,数据绑定正是允许视图忽略具体viewmodel类型(实现)的东西。编写
{Binding SomeProperty}
时唯一要告诉您的是
DataContext
对象可以有一个具有此名称的属性。顺便说一句,这甚至没有必要。在视图中使用强类型将它与一个精确的viewmodel实现联系在一起,这实际上不是MVVM的想法:将数据和视图分开。@dymanoid不管怎样,继续做你那些毫无意义的不必要的抽象,我会保持务实(而不是教条),每次都使用最好的工具来完成这项工作。正是因为像你这样的人,MVVM才受到如此的冷遇。正如我所说的,我宁愿不使用任何DataContext,也不使用我已经编写的代码。这有点可怕。但它是有效的,这似乎是我唯一能让它发挥作用的方法。我可以发布很多xaml,但不确定它是否有用。我基本上是以我发布的链接中的示例为例,直接对其进行修改,以供我使用。因此需要从chrome datacontext获取控件,然后从控件datacontext获取视图模型!丑!
void opacity_value_changed( object sender, RoutedPropertyChangedEventArgs<double> e )
    {
        Control ctrl = (Control)m_chrome.DataContext;
        SettingsViewModel settingsVM = ctrl.DataContext as SettingsViewModel;
        settingsVM.OpacityValue = e.NewValue;
    }