首页 > 解决方案 > 为什么我的边距绑定没有更新控件的边距?

问题描述

我有一个文本框,它有一个 UserControl,它会根据用户键入的内容出现/消失。UserControl 只是一个带有一些选项的简单弹出窗口。

我的 TextBox 控件中用于弹出窗口的 XAML 是:

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

DataContext 和 Visibility 绑定工作正常,弹出窗口显示,但 Margin 绑定什么也不做。我在 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();
    }
}

任何帮助将非常感激。

编辑:

在查看之后,我注意到可见性绑定也不起作用,所以我想我应该为 TextBox 添加 XAML,因为这可能会导致问题。

我从某个地方找到的一个示例中复制了大部分内容,因为它似乎可以满足我的要求:

<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>

标签: c#wpfbinding

解决方案


推荐阅读