【问题标题】:Binding Property to Two Different Controls [duplicate]将属性绑定到两个不同的控件
【发布时间】:2018-08-08 19:02:49
【问题描述】:

我有一个带有 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();
    }
}

主视图模型

 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>

【问题讨论】:

  • 他们有相同的DataContext吗?您是否在某处明确设置了 CTACallSubmit 的 DataContext?
  • 已更新。根据您的问题,我认为我需要明确说明 nocustomer 住在哪里。在这种情况下,我绑定的窗口的数据上下文将数据传递给用户控件的属性(可见性)。
  • 当您将 UserControl 的 DataContext 显式设置为 CTACallSubmitViewModel 实例时,&lt;views:CTACallSubmit Visibility="{Binding NoCustomer ...}"/&gt; 之类的绑定需要 CTACallSubmitViewModel 实例中的 NoCustomer 属性。这可能不是你想要的。通常不应显式设置 UserControl 的 DataContext,而应使用从父控件继承的 DataContext。
  • 如果有特定于用户控件但不特定于父控件的功能(即从下拉框中加载其他字段)会发生什么?

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


【解决方案1】:

以下创建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 的继承。

【讨论】:

  • 为用户控件设置数据上下文的正确方法是什么?
  • 正确的方法是让它从父窗口继承 DataContext,就像 ContenControl 一样。
  • 是的,我计划投票,但想检查其他一些事情。我收到一条错误消息,指出 relativesource 未处于查找祖先模式。我假设我需要搜索一种类型?另外让我失望的是内容控件只是将数据模板交换到以完全相同的方式绑定的其他用户控件。我原以为它也会把它弄坏。
  • 收到一个 xaml 错误:“RelativeSource 未处于查找祖先模式”
  • 您真的复制了我的示例标记吗?它在 WPF 应用程序中编译得很好。您尝试构建吗?
猜你喜欢
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2020-10-30
  • 2010-11-23
  • 2018-12-09
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多