я знаю, что стандартный XamlWriter не сохраняет привязки. но что действительно воняет, так это то, что текущее значение, которое содержит привязка, тоже не сериализуется.
мой текущий - действительно глупый - обходной путь - это создать DependencyProperty fooProperty и свойство foo. а также свойство foo2. Затем обработчик изменений foo записывает свое значение в foo2.
вы видите: глупо.
У кого-нибудь есть лучшее решение?
ура
- редактировать в ответ на Томаса -
в принципе ты прав. но при использовании ItemsControl это выглядит немного иначе:
<Window x:Class="TestApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestApp"
Title="MainWindow" Height="350" Width="525"
x:Name="window"
>
<StackPanel>
<StackPanel.Resources>
<x:Array x:Key="arr1" Type="{x:Type local:TestData}">
<local:TestData Message="itemcontrol binding 1"/>
<local:TestData Message="itemcontrol binding 2"/>
</x:Array>
</StackPanel.Resources>
<local:Test Foo="hard coded"/>
<local:Test Foo="{Binding Message, ElementName=window}"/>
<ItemsControl ItemsSource="{StaticResource arr1}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:Test Foo="{Binding Path=Message }"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Message = "direct binding";
}
public static DependencyProperty MessageProperty = DependencyProperty.Register("Message", typeof(string), typeof(MainWindow));
public string Message
{
get { return (string)GetValue(MessageProperty); }
set { SetValue(MessageProperty, value); }
}
}
public class Test : TextBox
{
public static DependencyProperty FooProperty = DependencyProperty.Register("Foo", typeof(string), typeof(Test), new PropertyMetadata(OnFooChanged));
private static void OnFooChanged(DependencyObject d, DependencyPropertyChangedEventArgs a)
{
(d as Test).Text = a.NewValue as String;
}
public string Foo
{
get { return (string)GetValue(FooProperty); }
set { SetValue(FooProperty, value); }
}
protected override void OnMouseEnter(MouseEventArgs e)
{
Debug.Print("foo is really: " + Foo);
Debug.Print(XamlWriter.Save(this));
}
}
public class TestData : DependencyObject
{
public static DependencyProperty MessageProperty = DependencyProperty.Register("Message", typeof(string), typeof(TestData));
public string Message
{
get { return (string)GetValue(MessageProperty); }
set { SetValue(MessageProperty, value); }
}
}
если вы запустите это тестовое приложение и наведете курсор на различные текстовые поля, вы увидите, что нет проблем с сериализацией жестко закодированных и непосредственно связанных значений.
напротив, привязка к данным не сериализуется.
кстати, нет никакой разницы в использовании ItemSource, сгенерированного кодом вместо StaticReference, только что протестировал это.