从另一个UserControl调用UserControl方法

时间:2019-04-15 14:56:03

标签: wpf methods call

我试图从其他UserControl的UserControl调用方法。我无法跟踪试图从中调用方法的UserControl。

我正在尝试调用AddDeal.xaml.cs中的以下方法

        public void loadDealProducts()
        {
            InfoBox.Information("loadDealProducts called.", "testing");
        }

我正在跟踪AddDeal UserControl,并尝试使用以下方法在文件AddDealProducts.xaml.cs中调用loadDealProducts()方法

            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。

不是使用GetWindow获取窗口,而是有一种获取UserControl的方法?我尝试了Window.GetUserControl和UserControl.GetUserControl,但是没有这样的方法。

发件人是AddDeal.xaml.cs中的DependencyObject,当我单击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,它是AddDeal.xaml.cs / xaml上的DependencyObject

当打开新窗口AddDealProduct时,它具有AddDealProduct.xaml(UI文件)及其.xaml.cs代码隐藏文件。在此文件中,我想从调用UserControl(AddDeal)中调用一个函数。

1 个答案:

答案 0 :(得分:0)

好,我解决了。

我将从源Windows UserControl的DependencyObject sender事件中获取的Button Click作为参数发送给另一个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);
            }
        }

希望有帮助。