<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的名称,其数据上下文被设置为该控件的viewmodel.IsSurveyModeOn和CommonProgressVisibility是viewmodel的公共属性,在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;
}
}
}
完整的xaml代码。
<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>
另一种避免名称绑定的方法可能是下面的。
<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 RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=xmln_to_your_lib:QuantChartView}" Path="DataContext.IsSurveyModeOn" />
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=xmln_to_your_lib:QuantChartView}" Path="DataContext.CommonProgressVisibility" />
</MultiBinding>
</MenuItem.IsEnabled>
</MenuItem>
在得到你的场景的一些信息后进行编辑
你不应该提到 DataContext.<your_property>
因为ContextMenuService的DataContext应该是相同的。QuantChartWindow
.
所以代码应该是这样的。
<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 Path="IsSurveyModeOn" />
<Binding Path="CommonProgressVisibility" />
</MultiBinding>
</MenuItem.IsEnabled>
</MenuItem>
请仔细检查你的ViewModel是否实现了... ... INotifyPropertyChanged
接口,否则Binding将无法正常工作。
你需要在你的转换器中进行更多的验证。
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if ((values != null) &&
(values.Length == 2) &&
(values[0] != null) &&
(values[1] != null) &&
(values[0] != DependencyProperty.UnsetValue) &&
(values[1] != DependencyProperty.UnsetValue) &&
(values[0] is bool) &&
(values[1] is Visibility))
{
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;
}
这是因为在你的XAML完全渲染之前,转换器可能会被调用。我没有检查你的XAML或其他代码中是否有其他问题。因此,也许这不足以解决你的问题,但这是它的一部分。