将 属性 绑定到两个不同的控件
Binding Property to Two Different Controls
我有一个带有 content control
和 custom 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
的新实例,并将 UserControl
的 DataContext
设置为此。
<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}"/>
像这样设置 UserControl
的 DataContext
通常不是一个好主意,因为它破坏了父 DataContext
.
的继承
我有一个带有 content control
和 custom 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
的新实例,并将 UserControl
的 DataContext
设置为此。
<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}"/>
像这样设置 UserControl
的 DataContext
通常不是一个好主意,因为它破坏了父 DataContext
.