Вызов метода UserControl из другого UserControl

#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);
            }
        }

 

Надеюсь, это поможет.