BoolToVisibilityConverter не запускается в UWP - PullRequest
1 голос
/ 31 мая 2019

Я полностью озадачен этим.У меня есть UserControl в UWP / C #, который содержит несколько Border объектов, которые должны быть дверями в комнаты.У меня есть 4 свойства зависимости (по одному для каждого направления - N, S, E, W), с типом bool, каждый из которых подключен к BoolToVisibilityConverter.Концепция заключается в том, что двери можно переключать между Visible и Collapsed, устанавливая свойство HasDirectionDoor true или false.Насколько я могу судить, все настроено правильно, но просто не работает.Если я ставлю точку останова на Convert и ConvertBack методы BoolToVisConverter, эти точки останова никогда не срабатывают, а это означает, что он даже не достигает конвертера.Тем не менее, просматривая то, что я написал, и сравнивая его с тем, что я нашел в различных руководствах, все выглядит одинаково и правильно.Может кто-нибудь, пожалуйста, посмотрите на код, я уверен, что это что-то простое, что мне не хватает, но я просто не вижу его.

BoolToVis:

namespace Crawler.Converters
{
    public class BoolToVisibilityConverter : IValueConverter
    {
        public BoolToVisibilityConverter()
        {

        }

        public object Convert(object value, Type targetType, object parameter, string language)
        {
            //return (value is bool && (bool)value) ? Visibility.Visible : Visibility.Collapsed;

            if (value is bool && (bool)value)
            {
                return Visibility.Visible;
            }
            return Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            return (value is Visibility && (Visibility)value == Visibility.Visible);
        }
    }
}

UserControl XAML:

<UserControl
    x:Class="Crawler.DungeonRoom"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Crawler"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:BooleanToVisibility="using:Crawler.Converters"
    mc:Ignorable="d" Background="White" Height="110" Width="110"
    d:DesignHeight="110" d:DesignWidth="110">
    <UserControl.Resources>
        <BooleanToVisibility:BoolToVisibilityConverter x:Key="BoolToVis" />         
    </UserControl.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="5" />
            <ColumnDefinition Width="25" />
            <ColumnDefinition Width="25" />
            <ColumnDefinition Width="25" />
            <ColumnDefinition Width="25" />
            <ColumnDefinition Width="5" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="5" />
            <RowDefinition Height="25" />
            <RowDefinition Height="25" />
            <RowDefinition Height="25" />
            <RowDefinition Height="25" />
            <RowDefinition Height="5" />
        </Grid.RowDefinitions>
        <Border Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="4" Grid.RowSpan="4" Background="White" />
        <Border x:Name="westDoor" Grid.Column="0" Grid.Row="2" Grid.RowSpan="2" Background="SaddleBrown" Visibility="{Binding HasWestDoor, Converter={StaticResource ResourceKey=BoolToVis}}" />
        <Border x:Name="northDoor" Grid.Column="2" Grid.Row="0" Grid.ColumnSpan="2" Background="SaddleBrown" />
        <Border x:Name="eastDoor" Grid.Column="5" Grid.Row="2" Grid.RowSpan="2" Background="SaddleBrown" />
        <Border x:Name="southDoor" Grid.Column="2" Grid.Row="5" Grid.ColumnSpan="2" Background="SaddleBrown" />
        <Border x:Name="roomIcon" Grid.Column="4" Grid.Row="1" BorderBrush="DimGray" BorderThickness="1 0 0 1">
            <Image Source="Assets\MapTiles\Camp.png" />
        </Border>
    </Grid>
</UserControl>

UserControl C #:

using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace Crawler
{
    public sealed partial class DungeonRoom : UserControl
    {
        public static readonly DependencyProperty HasWestDoorProperty =
            DependencyProperty.Register("HasWestDoor", typeof(Boolean), typeof(DungeonRoom), new PropertyMetadata(false));

        public static readonly DependencyProperty HasNorthDoorProperty =
            DependencyProperty.Register("HasNorthDoor", typeof(Boolean), typeof(DungeonRoom), new PropertyMetadata(false));

        public static readonly DependencyProperty HasEastDoorProperty =
            DependencyProperty.Register("HasEastDoor", typeof(Boolean), typeof(DungeonRoom), new PropertyMetadata(false));

        public static readonly DependencyProperty HasSouthDoorProperty =
            DependencyProperty.Register("HasSouthDoor", typeof(Boolean), typeof(DungeonRoom), new PropertyMetadata(false));

        public static readonly DependencyProperty TypeProperty =
            DependencyProperty.Register("Type", typeof(RoomType), typeof(DungeonRoom), new PropertyMetadata(0));

        public bool HasWestDoor
        {
            get { return (bool)GetValue(HasWestDoorProperty); }
            set { SetValue(HasWestDoorProperty, value); }
        }
        public bool HasNorthDoor
        {
            get { return (bool)GetValue(HasNorthDoorProperty); }
            set { SetValue(HasNorthDoorProperty, value); }
        }

        public bool HasEastDoor
        {
            get { return (bool)GetValue(HasEastDoorProperty); }
            set { SetValue(HasEastDoorProperty, value); }
        }

        public bool HasSouthDoor
        {
            get { return (bool)GetValue(HasSouthDoorProperty); }
            set { SetValue(HasSouthDoorProperty, value); }
        }

        public RoomType Type
        {
            get { return (RoomType)GetValue(TypeProperty); }
            set { SetValue(TypeProperty, value); }
        }

        public DungeonRoom()
        {
            this.InitializeComponent();
        }
    }
}

1 Ответ

2 голосов
/ 31 мая 2019

Возможно, ваша привязка не удалась, потому что вы не установили для нее источник или не задали DataContext для Border равным UserControl, где определено свойство источника.

Попробуйте присвоить UserControl a Name и связать его с помощью свойства ElementName:

<UserControl .... Name="uc">
...
    <Border x:Name="westDoor" ... Visibility="{Binding HasWestDoor, ElementName=uc,
         Converter={StaticResource ResourceKey=BoolToVis}}" />

Или используйте скомпилированную привязку :

<Border x:Name="westDoor" ... Visibility="{x:Bind HasWestDoor, Mode=OneWay,
     Converter={StaticResource ResourceKey=BoolToVis}}" />

Это должно привести к ошибке компиляции в случае сбоя привязки.

...