c# - 为什么我的边距绑定没有更新控件的边距?
问题描述
我有一个文本框,它有一个 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>
解决方案
推荐阅读
- ios - 如何在 SwiftUI 中为多行文本添加行高?
- node.js - 我的产品模型类是阻塞的还是非阻塞的?
- python - 如何在 Pycharm 或 jupyter 中使用从 google colab 导出的模型 (.pth)
- javascript - 用jquery结果替换当前div
- hive - 当一列不同时如何选择不重复的行?
- segmentation-fault - 为什么我在 GFG 中遇到最长回文序列问题的分段错误 (SIGSEGV)?
- reporting-services - Microsoft Report Builder - 需要将费用过帐期间转换为上个月
- c# - EF Core 获取从 DbContext 更新的数据
- html - 为什么垂直对齐:按钮上的基线相对于相邻文本将它们居中?
- java - 致命错误编译:java.lang.NoClassDefFoundError: com/sun/tools/javac/main/OptionName: com.sun.tools.javac.main.OptionName