【问题标题】:BooleanToVisibilityConverter works on Textblock and not on UserControlBooleanToVisibilityConverter 适用于 Textblock 而不是 UserControl
【发布时间】:2015-06-17 04:50:42
【问题描述】:

我正在开发一个 Windows Phone 项目。 我对我的 xaml 有一些不太了解的地方。

这里是:

<Page
x:Class="CitiBox.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:converters="using:CitiBox.Converters"
xmlns:views="using:CitiBox.Views"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
DataContext="{Binding Main, Source={StaticResource Locator}}">

<Page.Resources>
    <converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</Page.Resources>

<Grid>
    <!--<TextBlock Text="Test1" Visibility="{Binding Test2, Converter={StaticResource BooleanToVisibilityConverter}}"/>
    <TextBlock Text="Test2" Visibility="{Binding Test1, Converter={StaticResource BooleanToVisibilityConverter}}"/>-->
    <views:LoadingView Visibility="{Binding Test2, Converter={StaticResource BooleanToVisibilityConverter}}"/>
    <views:DrawerView Visibility="{Binding Test1, Converter={StaticResource BooleanToVisibilityConverter}}"/>
</Grid>    
</Page>

如您所见,有两个已注释的文本块和两个视图(用户控件)。您还可以看到,我使用 BooleanToVisibilityConverter 将这四个元素的可见性绑定到两个布尔值。

让我吃惊的是,如果我用两个文本块测试这段代码,它可以工作,如果我用视图尝试它,它就不行。我的视图只包含一个带有消息的文本块,没什么特别的......

这是他们的样子:

<UserControl
x:Class="CitiBox.Views.LoadingView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:CitiBox.Views"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400"
DataContext="{Binding Loading, Source={StaticResource Locator}}">

<Grid>
    <TextBlock Text="Loading!!"/>
</Grid>
</UserControl>

你知道它可能是什么吗? 提前致谢, 纪尧姆。

【问题讨论】:

    标签: wpf xaml binding windows-phone-8.1


    【解决方案1】:

    问题在于DataContext的使用。你的 MainPage 有一个 DataContext :

    DataContext="{Binding Main, Source={StaticResource Locator}}"
    

    LoadingView 也有一个 DataContext

    因此,当您编写此代码时:

    您尝试在 LoadingView 的 DataContext 中查找 Test2 作为字段,因为您在同一个视图中。为了避免这种行为,你可以试试这个:

    <views:LoadingView Visibility="{Binding  ElementName=Page,Path=DataContext.Test2, Converter={StaticResource BooleanToVisibilityConverter}}"/>
    

    或者您可以编写一个名为 NavigationService 的类,继承自 INavigationService (MVVM Light) 您项目中的每个视图都将是一个页面,您将成为所有页面之间的过渡(如淡入淡出)

    【讨论】:

      【解决方案2】:

      在您的UserControl 中,您明确设置了DataContext

      DataContext="{Binding Loading, Source={StaticResource Locator}}"
      

      这意味着以下绑定将不起作用:

      Visibility="{Binding Test2, Converter={StaticResource BooleanToVisibilityConverter}}"
      

      原因是因为绑定在UserControl的当前DataContext中寻找Test2。相反,您需要在 父控件的 DataContext 中寻找 Test2

      试试这个:

      Visibility="{Binding DataContext.Test2, RelativeSource={RelativeSource AncestorType=Page}, Converter={StaticResource BooleanToVisibilityConverter}}"
      

      【讨论】:

      • 我收到一条错误消息,提示“无法识别或无法访问成员“AncestorType”。还有说“无法解析DataContext ... ...”的错误有什么线索吗?
      【解决方案3】:

      我认为你的问题是 DataContext 因为页面数据上下文是

      DataContext="{Binding Main, Source={StaticResource Locator}}"
      

      当您将 usercontrol dataContext 设置为 DataContext="{Binding Loading, Source={StaticResource Locator}}" 时尝试像这样更改您的代码

      <Page x:Class="CitiBox.MainPage"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:converters="using:CitiBox.Converters"
            xmlns:views="using:CitiBox.Views"
            mc:Ignorable="d"
            Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
            DataContext="{Binding Main, Source={StaticResource Locator}}"
            x:Name="Page">
      
      <Page.Resources>
         <converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
      </Page.Resources>
      
      <Grid>
          <!--<TextBlock Text="Test1" Visibility="{Binding Test2, Converter={StaticResource BooleanToVisibilityConverter}}"/>
          <TextBlock Text="Test2" Visibility="{Binding Test1, Converter={StaticResource BooleanToVisibilityConverter}}"/>-->
          <views:LoadingView Visibility="{Binding  ElementName=Page,Path=DataContext.Test2, Converter={StaticResource BooleanToVisibilityConverter}}"/>
          <views:DrawerView Visibility="{Binding  ElementName=Page,Path=DataContext.Test1, Converter={StaticResourceBooleanToVisibilityConverter}}"/>
      </Grid>    
      </Page>
      

      【讨论】:

      • 如果我这样做,我的页面的 DataContext 将不再是 MainViewModel,而是我根本不想要的 LoadingViewModel。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      相关资源
      最近更新 更多