多绑定表达式总是在它的多转换器中显示DependencyProperty.UnsetValue。

问题描述 投票:0回答:1
<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>
.net wpf xaml data-binding multibinding
1个回答
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 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将无法正常工作。


0
投票

你需要在你的转换器中进行更多的验证。

  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或其他代码中是否有其他问题。因此,也许这不足以解决你的问题,但这是它的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.