У меня есть текстовое поле с 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>