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

时间:2018-02-28 19:41:49

标签: wpf data-binding custom-controls visibility contentcontrol

我有一张带有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}"/>

更新

MainWindow的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>

1 个答案:

答案 0 :(得分:1)

以下内容创建了componentDidMount() { this.range.rangeslider(); } 的新实例,并将CTACallSubmitViewModel的{​​{1}}设置为此实例。

DataContext

这意味着除非您指定绑定源,否则绑定到其他视图模型的UserControl属性将无法工作:

<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}"/> 通常是一个坏主意,因为它会破坏父DataContext的继承。