Предусловия:
Вы создали свой контрол. В своём контроле создали своё DependencyProperty с объектом коллекции, например ObservableCollection<>:
Listing 1:
public static readonly DependencyProperty ElementPortsProperty = DependencyProperty.Register("CollectedProperty",
typeof(ObservableCollection<>), typeof(MyClass), new FrameworkPropertyMetadata(new ObservableCollection<>());
Проблема:
Возможна следующая ситуация когда вы восстанавливаете такой объект при помощи XamlReader: свойство-коллекция элемента содержит дублированные
элементы.
Пояснение:
Если в контроле есть custom свойство-коллекция, которое заполнено в XAML-файле вашего контрола то в момент дессериализации будет происходить следующее:
Восстановится ваш контрол целиком (с заполненным по-умолчанию свойством-коллекцией), затем в Xaml-файле обнаружится коллекция с объектами и эти объекты добавятся в восстановленный Custom Control.
Как с этим бороться? Два очевидных способа:
1. Не заполнять в Конструкторе коллекцию, а инициализировать её заполнение из .cs-файла когда это нужно.
2. В элементы коллекции добавить уникальный ключ, который позволит проверять наличие этого элемента в коллекции.
Примеры:
Binary of uncorrect working DP
Binary of correct working DP
Sources of correct working DP
Читать дальше......
четверг, 18 июня 2009 г.
Запуск WPF-приложения с параметрами
Что нужно сделать, чтобы доступиться к входным параметрам WPF-приложения?
Классическое WinForms-приложение имеет точку входа следующего вида:
public static void Main(string[] parameters)
где parameters и есть те самые входные параметры.
Чтобы доступиться до входных параметров WPF-приложения, нужно использовать перегрузку метода:
OnStartup(StartupEventArgs e)
В общем виде ваш стартовый класс может выглядеть так:
Listing 1:
Listing...
private static string[] _arguments;
public static string[] AppArguments
{
get { return _arguments;
}
public App()
{
InitializeComponent();
}
protected override void OnStartup(StartupEventArgs e)
{
_arguments = new string[e.Args.Length];
for (int i = 0; i <>
{
_arguments[i] = e.Args[i];
}
}
Входные параметры сохраняются в статическом свойстве и будут легко доступны из любой точки приложения.
Примеры:
Source of the example "How to Run WPF Application with parameters".
Binary of the example "How to Run WPF Application with parameters".
Читать дальше......
Классическое WinForms-приложение имеет точку входа следующего вида:
public static void Main(string[] parameters)
где parameters и есть те самые входные параметры.
Чтобы доступиться до входных параметров WPF-приложения, нужно использовать перегрузку метода:
OnStartup(StartupEventArgs e)
В общем виде ваш стартовый класс может выглядеть так:
Listing 1:
Listing...
private static string[] _arguments;
public static string[] AppArguments
{
get { return _arguments;
}
public App()
{
InitializeComponent();
}
protected override void OnStartup(StartupEventArgs e)
{
_arguments = new string[e.Args.Length];
for (int i = 0; i <>
{
_arguments[i] = e.Args[i];
}
}
Входные параметры сохраняются в статическом свойстве и будут легко доступны из любой точки приложения.
Примеры:
Source of the example "How to Run WPF Application with parameters".
Binary of the example "How to Run WPF Application with parameters".
Читать дальше......
Подписаться на:
Сообщения (Atom)