将 属性 绑定到两个不同的控件

Binding Property to Two Different Controls

我有一个带有 content controlcustom control 的 WPF 表单。 content control 根据单选按钮选择交换视图。用户在视图上执行操作后,我将父级 viewmodel(包含两个控件的 WPF 窗体)的 nocustomer 设置为 false。发生这种情况时,content control 的可见性会正确消失。不幸的是,custom control 的可见性保持不变(它也应该消失)。我实际上很困惑,因为在我看来它们具有完全相同的实现,因此应该表现相同。

<ContentControl x:Name="ViewSwap" Content="{Binding SearchingViewModel}" 
Visibility="{Binding NoCustomer, Converter={StaticResource 
BooleanToVisibilityConverter}, Mode=OneWay}">
    <ContentControl.Style>
        <Style TargetType="{x:Type ContentControl}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=SearchOptions, Path=IsSelected}" Value="0">
                    <Setter Property="ContentTemplate" Value="{StaticResource AddressTemplate}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

<views:CTACallSubmit x:Name="CallSubmit" 
Visibility="{Binding NoCustomer, Converter={StaticResource 
BooleanToVisibilityConverter}, Mode=OneWay}"/>

更新:

主窗口的 DataContext

public partial class CTALight : Window
{
    public CTALight()
    {
        InitializeComponent();

        this.DataContext = CTALightViewModel.GetInstance();
    }
}

MainViewModel

 public class CTALightViewModel : ObservableObject
 {
    public static CTALightViewModel _mainViewModel;

    public static CTALightViewModel GetInstance()
    {
        if (_mainViewModel == null)
            _mainViewModel = new CTALightViewModel();          

        return _mainViewModel;
    }

    private CTALightViewModel()
    {
    }

}

CTACallSubmit DataContext

<UserControl.DataContext>
    <viewmodel:CTACallSubmitViewModel />
</UserControl.DataContext>

下面创建了一个 CTACallSubmitViewModel 的新实例,并将 UserControlDataContext 设置为此。

<UserControl.DataContext>
    <viewmodel:CTACallSubmitViewModel />
</UserControl.DataContext>

这意味着绑定到另一个视图模型的 NoCustomer 属性 将不起作用,除非您指定绑定的源:

<views:CTACallSubmit x:Name="CallSubmit" 
        Visibility="{Binding DataContext.NoCustomer, 
        RelativeSource={RelativeSource AncestorType=Window}, 
        Converter={StaticResource BooleanToVisibilityConverter}, Mode=OneWay}"/>

像这样设置 UserControlDataContext 通常不是一个好主意,因为它破坏了父 DataContext.

的继承