【发布时间】:2020-10-06 20:35:01
【问题描述】:
<ContextMenuService.ContextMenu>
<ContextMenu>
<MenuItem IsCheckable="False" x:Name="MnuSendToFolder" Header="{Binding Path=SendToFolder,
Source={StaticResource LRWpf}}" Command="{Binding SendToFolderCommand}" >
<MenuItem.IsEnabled>
<MultiBinding Converter="{StaticResource VisibilityConverter}">
<Binding ElementName="QuantChartWindow" Path="DataContext.IsSurveyModeOn" />
<Binding ElementName="QuantChartWindow" Path="DataContext.CommonProgressVisibility" />
</MultiBinding>
</MenuItem.IsEnabled>
</MenuItem>
</ContextMenu>
</ContextMenuService.ContextMenu>
这里,QuantChartWindow 是主 UserControl 的名称,其数据上下文设置为该控件的视图模型。 IsSurveyModeOn 和 CommonProgressVisibility 是视图模型的公共属性。 在 multiconverter 的 Convert 函数中,这两个值总是以 UnsetValue 的形式出现。
public class VisibilityConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if(values!=null && values.Length==2)
{
Visibility visvalue = (Visibility)values[1];
bool isSurveyMode = (bool)values[0];
if (visvalue == Visibility.Hidden || visvalue == Visibility.Collapsed)
{
if(!isSurveyMode)
return true;
}
else
return false;
}
return false;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
添加QuantChartWindow声明部分:
<UserControl x:Class="UI.SpectrumView.Views.QuantChartView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml"
xmlns:Controls="http://metro.mahapps.com/winfx/xaml/controls"
xmlns:local="clr-namespace:UI.SpectrumView.Views"
xmlns:spccon="clr-namespace:UI.SpectrumView.Converter"
xmlns:ui="clr-namespace:UI.Converter;assembly=Comp.UI"
mc:Ignorable="d"
**x:Name="QuantChartWindow"**
d:DesignHeight="450" d:DesignWidth="800" Background="{DynamicResource DefaultColor}">
代码隐藏文件
public partial class QuantChartView : UserControl, IView
{
QuantChartViewModel _viewModel;
public QuantChartView(QuantChartViewModel vm)
{
InitializeComponent();
this.DataContext = vm;
_viewModel = vm;
vm.Chart1 = Chart1;
vm.Chart2 = Chart2;
vm.GridChart2 = GridChart2;
vm.View = this;
}
}
查看模型类 QuantChartViewModel.cs
public class QuantChartViewModel : DockWindowViewModel
{
private readonly IEventAggregator _eventAggregator;
private readonly IUnityContainer _container;
private ICommonService _common;
public QuantChartViewModel(IUnityContainer container, IEventAggregator eventAggregator, ICommonService common)
{
this._container = container;
this.QuantViewModel = container.Resolve<QuantViewModel>();
_common = common;
}
private bool _isSurveyModeEnabled =false;
public bool IsSurveyModeOn
{
get
{
return QuantViewModel.IsEDSSurveyMode;
}
}
private Visibility _commonProgressVisibility;
public bool CommonProgressVisibility
{
get
{
return _common.CommonProgressVisibility;
}
}
}
完整的xml代码:
<UserControl x:Class="UI.SpectrumView.Views.QuantChartView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-
compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml"
xmlns:Controls="http://metro.mahapps.com/winfx/xaml/controls"
xmlns:local="clr-namespace:UI.SpectrumView.Views"
xmlns:spccon="clr-namespace:UI.SpectrumView.Converter"
xmlns:ui="clr-namespace:UI.Converter;assembly=Comp.UI"
mc:Ignorable="d"
x:Name="QuantChartWindow"
d:DesignHeight="450" d:DesignWidth="800" Background="
{DynamicResource DefaultColor}">
<Grid>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<TabControl Name="TabControl1" HorizontalAlignment="Stretch"
Background="{DynamicResource DefaultColor}" Margin="0,0,0,0"
SelectedIndex="{Binding TabSelectedIndex}">
<TabItem Header="{Binding Path=tbGraph, Source={StaticResource
LRWpf}}" Controls:ControlsHelper.HeaderFontSize="16"
x:Name="tabControlItem" >
<StackPanel Name="ChartPanel">
<StackPanel Orientation="Horizontal">
<ListView MinHeight="30" x:Name="lstChartMode"
Width="120" >
<Rectangle Fill="{DynamicResource
DefaultIconColor}" Height="25" Width="25"
Margin="5,0,0,0" >
</Rectangle>
</ListView>
</StackPanel>
<c1:C1Chart Name="Chart1" ChartType="{Binding
SelectedChartType}" Palette="Module" Margin="0,10,0,0">
<ContextMenuService.ContextMenu>
<ContextMenu>
<MenuItem IsCheckable="False"
x:Name="MnuSendToFolder" Header="
{Binding Path=SendToFolder, Source=
{StaticResource LRWpf}}" Command="
{Binding SendToFolderCommand}">
<MenuItem.IsEnabled>
<MultiBinding Converter="
{StaticResource
VisibilityConverter}">
<Binding
ElementName="QuantChartWindow"
Path="DataContext.IsSurveyModeOn"/>
<Binding
ElementName="QuantChartWindow"
Path="DataContext.CommonProgressVisibility"/>
</MultiBinding>
</MenuItem.IsEnabled>
</MenuItem>
</ContextMenu>
</ContextMenuService.ContextMenu>
</c1:C1Chart>
</StackPanel>
</TabItem>
</TabControl>
</ScrollViewer>
</Grid>
</UserControl>
【问题讨论】:
-
当您没有显示多绑定转换器的代码时,很难提供帮助。但一般来说,当属性的值还没有被赋值时,UnsetValue 会被移交
-
@AndersH :发布了代码的转换器部分。请看一下
-
请发布代码的所有相关部分。 QuantChartWindow 到底设置在哪里?视图模型属性声明是什么样的?您在 Visual Studio 的输出窗口中观察到哪些数据绑定错误?我的猜测是 ElementName 解析失败。
-
发布了代码的其他相关部分@Clemens
-
Visual Studio 的输出窗口中是否有任何数据绑定错误消息?
标签: .net wpf xaml data-binding multibinding