在不使用当前DataContext的情况下显式绑定到对象

本文关键字:情况下 绑定 对象 DataContext | 更新日期: 2023-09-27 18:02:35

描述:

我有一些视图,其DataContext已设置为某个列表。

我还有一个ComboBox,它应该触发StackPanel的Visibility事件。它是通过实现INotifyPropertyChanged的属性"SelectedVisibility"来完成的。

问题:

属性"SelectedVisibility"不是DataContext的一部分,而是在ViewModel类中,我找不到任何方法来显式绑定我的ViewModel以访问该属性。

问题:

你知道我如何在ComboBox中将VM明确定义为SelectedValue绑定的DataContext吗

代码详细信息:

查看XAML:

<ComboBox ItemsSource="{Binding Source={StaticResource VisibilityEnum}}" SelectedValue="{Binding Path=SelectedVisibility}"/>
<StackPanel Visibility="{Binding Path=SelectedVisibility,Converter={StaticResource SelectedValueToVisible}}">

查看代码背后:

public Counterparties_UserInputs()
{
    // Cannot bind this as already bound
    // this.DataContext = _VM;
    InitializeComponent();
}

视图模型:

public event PropertyChangedEventHandler PropertyChanged;
public string SelectedVisibility
{
    get 
    {
        return _selectedVisibility; 
    }
    set
    {
        _selectedVisibility= value;
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs("SelectedVisibility"));
        }
    }
}

提前谢谢!

在不使用当前DataContext的情况下显式绑定到对象

您可以向视图添加一个新的dependency属性,将视图模型绑定到此属性,然后将此属性用作StackPanel和ComboBox的DataContext。例如("this"是视图的名称,"AdditionalContext"是您为存储视图模型而声明的依赖性属性(:

<StackPanel DataContext="{Binding AdditionalContext, ElementName=this}" Visibility="{Binding Path=SelectedVisibility, Converter={StaticResource SelectedValueToVisible}}"/>

但是,您不应该这样做,因为这违反了MVVM模式。视图模型的全部意义在于,您将其用作视图的DataContext。解决问题的正确方法是将List声明移动到视图模型中。