Почему привязка моей маржи не обновляет маржу моего контроля? - PullRequest
0 голосов
/ 05 марта 2020

У меня есть текстовое поле с UserControl, который будет появляться / исчезать в зависимости от того, что пользователь вводит. UserControl - это просто простое всплывающее окно с некоторыми параметрами.

XAML в моем элементе управления TextBox для всплывающего окна:

<local:CustomPopUp HorizontalAlignment="Left"
                   VerticalAlignment="Top"
                   DataContext="{Binding PopupVM}"
                   Margin="{Binding PopupMargin, Converter={local:StringToMarginConverter}}"
                   Visibility="{Binding PopupIsOpen, Converter={StaticResource BoolToVis}}" />

Привязки DataContext и Visibility работают правильно и всплывающее окно показывает, но привязка поля не делает ничего. У меня есть точки останова внутри StringToMarginConverter, но они никогда не удаляются.

Если я устанавливаю поле на значение вместо использования привязки Margin = "100,200,0,0", тогда это работает - когда отображается всплывающее окно, всплывающее окно смещается от с левой стороны и сверху по значениям полей.

Свойство PopupMargin находится в ViewModel для текстового поля (аналогично свойствам PopupVM и PopupIsOpen) и имеет вид:

public string PopupMargin{ get; set; } = "0,0,0,0";

Я пытался установить новое значение свойства на разных этапах, но, кажется, ничто не вызывает обновления поля для обновления.

Я довольно новичок в C# и WPF, поэтому, возможно, просто упускаю что-то простое. Я мог просто установить это поле в коде, но подумал, что это лучший способ сделать это.

Хотя StringToMarginConverter никогда не запускается, это код:

class StringToMarginConverter : BaseConverter<StringToMarginConverter>
{
    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string[] indVals = value.ToString().Split(',');
        Double.TryParse(indVals[0], out double left);
        Double.TryParse(indVals[1], out double top);
        Double.TryParse(indVals[2], out double right);
        Double.TryParse(indVals[3], out double bottom);


        return new Thickness(left, top, right, bottom);
    }

    public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Любая помощь будет очень признателен.

РЕДАКТИРОВАТЬ:

После просмотра я заметил, что привязка видимости также не работает, поэтому я решил добавить XAML для TextBox, поскольку это может вызывать проблему.

Я скопировал большую часть этого из примера, который я нашел где-то, так как он, казалось, делал то, что хотел:

<TextBox x:Class="MyProject.CustomTextBox"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:local="clr-namespace:MyProject" 
     TextWrapping="NoWrap" 
     Foreground="#00000000"
     Name="MainTextBox"
     Text="{Binding DocText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
     PreviewTextInput="TextBox_PreviewTextInput"
     SelectionChanged="MainTextBox_SelectionChanged">
<TextBox.Resources>
    <local:BooleanToVisibilityConverter x:Key="BoolToVis" True="Visible" False="Collapsed" />
</TextBox.Resources>
<TextBox.Style>
    <Style TargetType="{x:Type local:CustomTextBox}">
        <Setter Property="AcceptsReturn" Value="True" />
        <Setter Property="AcceptsTab" Value="True" />
        <Setter Property="HorizontalScrollBarVisibility" Value="Auto" />
        <Setter Property="VerticalScrollBarVisibility" Value="Disabled" />
        <Setter Property="FontFamily" Value="Helvetica" />
        <Setter Property="FontSize" Value="9pt" />
    </Style>
</TextBox.Style>

<TextBox.Template>
    <ControlTemplate TargetType="{x:Type local:CustomTextBox}">
        <!--Visual-->
        <Border Background="White" BorderThickness="{TemplateBinding BorderThickness}"
                BorderBrush="{TemplateBinding BorderBrush}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="auto" />
                    <ColumnDefinition Width="auto" />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>

                <local:DrawingControl Grid.Column="0" ClipToBounds="True" />

                <Line Grid.Column="1" Margin="2,0,5,0" Stroke="Gray" StrokeThickness="1" Y2="1" Stretch="Fill"
                        StrokeDashArray="1,1" RenderOptions.EdgeMode="Aliased" />

                <Grid Grid.Column="2">
                    <!--Render canvas-->
                    <Grid Margin="{TemplateBinding Padding}">
                        <local:DrawingControl ClipToBounds="True"
                                TextOptions.TextRenderingMode="ClearType" TextOptions.TextFormattingMode="Display" />
                    </Grid>
                    <!--Transparent input textbox-->
                    <ScrollViewer Background="#00FFFFFF" />

                    <!--Custom Popup Control-->
                    <local:CustomPopUp HorizontalAlignment="Left"
                                       VerticalAlignment="Top"
                                       DataContext="{Binding PopupVM}"
                                       Margin="{Binding PopupMargin, Converter={local:StringToMarginConverter}}"
                                       Visibility="{Binding PopupIsOpen, Converter={StaticResource BoolToVis}}" />

                </Grid>

            </Grid>

        </Border>


    </ControlTemplate>
</TextBox.Template>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...