Это попытка расширить этот вопрос. В моей программе WPF я клонировал tabItems
, используя XamlWriter
в функции с именем TrycloneElement
. Первоначально я нашел эту функцию здесь, но функцию также можно посмотреть в ссылке на мой предыдущий вопрос.
Теперь, когда я начинаю беспокоиться о функциональности своей программы, я обнаружил, что функция TrycloneElement
не копирует какие-либо функции кода программной части, назначенные клонируемому ею tabItem
.
Из-за ссылки High Core и комментариев к моему предыдущему вопросу я решил начать реализацию функциональности на моем tabItems
через привязку данных с моей ViewModel.
Вот пример команды, которую я реализовал:
public viewModel()
{
allowReversing = new Command(allowReversing_Operations);
}
public Command AllowReversing
{
get { return allowReversing; }
}
private Command allowReversing;
private void allowReversing_Operations()
{
//Query for Window1
var mainWindow = Application.Current.Windows
.Cast<Window1>()
.FirstOrDefault(window => window is Window1) as Window1;
if (mainWindow.checkBox1.IsChecked == true) //Checked
{
mainWindow.checkBox9.IsEnabled = true;
mainWindow.groupBox7.IsEnabled = true;
}
else //UnChecked
{
mainWindow.checkBox9.IsEnabled = false;
mainWindow.checkBox9.IsChecked = false;
mainWindow.groupBox7.IsEnabled = false;
}
}
*ПРИМЕЧАНИЕ. Я знаю, что я обманывал и напрямую взаимодействовал с моим представлением в приведенном выше коде, но я не знал, как еще запускать эти команды. Если это проблема или есть другой способ, пожалуйста, покажите мне, как я могу запускать те же самые команды, не взаимодействуя с представлением, как я.
Теперь вопрос:
После изменения моего кода и добавления команд в мою ViewModel функция TrycloneElement
больше не работает. Во время выполнения во время клонирования вкладки я получаю XamlParseException
в строке, object x = XamlReader.Load(xmlReader);
, которая гласит:
Я согласен отказаться от этой функции, если есть лучший способ, и он мне больше не нужен. Но, в конце концов, как мне взять дизайн и функциональность tabItem
и клонировать их? (Пожалуйста, имейте в виду, что я действительно пытаюсь исправить свою структуру)
Спасибо за помощь.
Пересмотр ответа Лео
Это текущая версия ответа Лео, которую я компилирую. (Были некоторые синтаксические ошибки)
public static IList<DependencyProperty> GetAllProperties(DependencyObject obj)
{
return (from PropertyDescriptor pd in TypeDescriptor.GetProperties(obj, new Attribute[] { new PropertyFilterAttribute(PropertyFilterOptions.SetValues) })
select DependencyPropertyDescriptor.FromProperty(pd)
into dpd
where dpd != null
select dpd.DependencyProperty).ToList();
}
public static void CopyPropertiesFrom(this FrameworkElement controlToSet,
FrameworkElement controlToCopy)
{
foreach (var dependencyValue in GetAllProperties(controlToCopy)
.Where((item) => !item.ReadOnly)
.ToDictionary(dependencyProperty => dependencyProperty, controlToCopy.GetValue))
{
controlToSet.SetValue(dependencyValue.Key, dependencyValue.Value);
}
}
IsEnabled
иIsChecked
, должны быть в вашей ViewModel (или модели), а ваш XAML (в данном случаеTabItem
) — это просто довольно удобный интерфейс, используемый для отображения ViewModel пользователю . Чтобы создать новую вкладку, вы действительно хотите создать новую ViewModel и добавить ее в коллекцию, которая будет автоматически отрисовываться с использованием нового TabItem. - person Rachel   schedule 05.09.2013