#wpf #methods #call
#wpf #методы #вызов
Вопрос:
Я пытаюсь вызвать метод из UserControl из другого UserControl. Я не могу отследить UserControl, из которого я пытаюсь вызвать метод, для вызова метода.
Я пытаюсь вызвать следующий метод, который находится в AddDeal.xaml.cs
public void loadDealProducts()
{
InfoBox.Information("loadDealProducts called.", "testing");
}
Я отслеживаю AddDeal UserControl и пытаюсь вызвать метод loadDealProducts() в файле AddDealProducts.xaml.cs, используя следующий метод
Window window = null;
if (sender is Window)
window = (Window)sender;
if (window == null)
window = Window.GetWindow(sender);
return window;
(window as AddDeal).loadDealProducts();
Но window возвращает null, поэтому я не могу вызвать метод loadDealProducts .
Есть ли способ получить UserControl вместо получения окна с помощью GetWindow? Я попробовал Window.GetUserControl и UserControl .GetUserControl но такого метода нет.
отправителем является DependencyObject из AddDeal.xaml.cs, который я получаю, когда нажимаю кнопку на AddDeal.xaml следующим образом:
<Button Click="BtnAddProducts" CommandParameter="{Binding Path=ProductID}">Add Product</Button>
который вызывает следующее:
private void BtnAddProducts(object sender, RoutedEventArgs e)
{
var button = (Button)sender as DependencyObject;
Window AddProductsDialog = new Window {
Title = "Add Products to Deal",
Content = new AddDealProduct(button, productID, false, 0)
};
AddProductsDialog.ShowDialog();
}
Как вы можете видеть, я отправляю button
объект DependencyObject на AddDeal.xaml.cs /xaml
Когда он открывает новое окно AddDealProduct, в нем есть AddDealProduct.xaml (файл пользовательского интерфейса) и его кодовый файл .xaml.cs. В этом файле я хочу вызвать функцию из вызывающего UserControl(AddDeal).
Комментарии:
1. Где вы создаете экземпляр
AddDeal
? В каком окне? И гдеAddDealProducts
он находится?2. У меня есть два файла, AddDeal.xaml и AddDealProducts.xaml, и оба файла содержат файл xaml.cs code-behid, в котором я выполняю кодирование на c #. Оба файла имеют <UserControl x:Class=»AddDeal»> … Элементы и стили пользовательского интерфейса…. </UserControl> в файлах .xaml.
3. Я отредактировал свой вопрос, чтобы объяснить больше.
4. Поскольку все ваше окно будет этим usercontrol, я думаю, что это должно быть window вместо usercontrol. Когда вы отправляете отправителя, это предположительно происходит из щелчка или какого-либо подобного события. (Здесь необходимы некоторые догадки, потому что вы недостаточно объяснили). Отправителем (вероятно) будет кнопка, а не окно. Вам нужно было бы привести отправителя к тому, что это такое, а затем getwindow для этого. Если отправитель находится в нужном вам usercontrol, то…. Получите содержимое окна, чтобы найти свой usercontrol.
5. Вы на правильном пути, я должен получить UserControl, но это функция, которую я хочу вызвать, которая находится в классе / файле UserControl.
Ответ №1:
Хорошо, я решил это.
Я отправляю DependencyObject sender
то, что я получаю от Button Click
события из исходного окна UserControl, в другой класс UserControl в качестве параметра.
Затем я использую объект sender для разрешения UserControl и вызова функции в его классе из другого класса UserControl.
Для вызова функции я делаю следующее:
AddDealUserControl ownerx2 = FindVisualParent<AddDealUserControl>(sender);
ownerx2.loadDealProducts();
Вспомогательный класс FindVisualParent:
public static T FindVisualParent<T>(DependencyObject child)
where T : DependencyObject
{
// get parent item
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
// we’ve reached the end of the tree
if (parentObject == null) return null;
// check if the parent matches the type we’re looking for
T parent = parentObject as T;
if (parent != null)
{
return parent;
}
else
{
// use recursion to proceed with next level
return FindVisualParent<T>(parentObject);
}
}
Надеюсь, это поможет.