Я также сделал простое решение и скопировал в ваш код, и он работал нормально. У Кента было объявлено его всплывающее окно в XAML, но я использовал ваш точный код для создания всплывающего окна и установки привязки, поэтому различие не должно быть причиной проблемы для вас.
Мне интересно, не могли бы вы опубликовать, откуда берется исходная переменная. Вы не показываете это, и мне интересно, если это то, что вы думаете.
Еще одна вещь, которую вы, вероятно, можете попробовать, - это сохранить ссылку на всплывающее окно, если оно собирает мусор. Я полагаю, что это возможно, как если бы я правильно помню, что привязка использует недельный обработчик событий для уведомления об изменениях, чтобы они не были постоянной ссылкой на экземпляр Popup. Я думаю, что это маловероятно, но, возможно, стоит попробовать.
К вашему сведению, код, который я использовал для проверки, выглядит следующим образом.
XAML-файл:
<Window x:Class="PopupOpenBindingTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1"
Height="300"
Width="300">
<Grid>
<TextBox Height="23"
Margin="54,12,104,0"
Name="textBox1"
VerticalAlignment="Top"
Text="{Binding Text, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}" />
</Grid></Window>
код-позади.
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
DataContext = new DataObjectTest();
this.Loaded += new RoutedEventHandler(Window1_Loaded);
}
void Window1_Loaded(object sender, RoutedEventArgs e)
{
TextBox source = textBox1;
Popup popup = new Popup();
popup.Name = "somepopup";
popup.PlacementTarget = source;
popup.Placement = PlacementMode.Bottom;
TextBlock txtblock = new TextBlock();
txtblock.Background = Brushes.LightBlue;
txtblock.Foreground = Brushes.Blue;
txtblock.Text = "this is the error message";
popup.Child = txtblock;
Binding is_open_binding = new Binding("(Validation.HasError)");// { Path = new PropertyPath(Validation.HasErrorProperty) };
is_open_binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
is_open_binding.Source = source;
is_open_binding.Mode = BindingMode.OneWay;
is_open_binding.NotifyOnValidationError = true;
is_open_binding.ValidatesOnExceptions = true;
//is_open_binding.Converter = new TempValueConverter();
popup.SetBinding(Popup.IsOpenProperty, is_open_binding);
}
public class DataObjectTest
{
private string _text = string.Empty;
public string Text
{
get { return _text; }
set
{
if (value.Length > 5)
throw new InvalidOperationException("Blah blah blah");
_text = value;
}
}
}