WPF, вызывающий метод с параметрами в классе XAML - PullRequest
0 голосов
/ 03 августа 2010

У меня есть ObjectDataProvider в моем XAML, который ссылается на метод в моем Window классе. То есть у меня NewForm.xaml.cs с классом NewForm, а ObjectDataProvider в NewForm.xaml ссылается на метод в NewForm. В настоящее время со следующим XAML я получаю ошибку переполнения стека, потому что конструктор NewForm продолжает вызываться снова и снова:

<Window x:Class="MyNamespace.NewForm" ...>
<Window.Resources>
<ObjectDataProvider x:Key="getTeamName"
                    ObjectType="{x:Type local:NewForm}"
                    MethodName="GetTeamName">
    <ObjectDataProvider.MethodParameters>
        <sys:Int32>-1</sys:Int32>
    </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
</Window>

Я предполагаю, что это потому, что ObjectType установлен на NewForm, поэтому он загружает NewForm для загрузки моего приложения, но затем ему нужно создать новый экземпляр NewForm для вызова GetTeamName, но конструктор вызывает InitializeComponent, который создает новый NewForm, который должен создать новый NewForm для вызова GetTeamName ... Фактически каждый раз происходит сбой Visual Studio 2010.

В любом случае, я спрашиваю, нужно ли мне определять методы, которые мой XAML вызывает через ObjectDataProvider s в каком-то другом классе? Или я могу как-то использовать ObjectDataProvider с методом, определенным в классе моего XAML? Или для вызова метода в моем классе XAML, должен ли я использовать какой-то другой XAML, кроме ObjectDataProvider? Не похоже, что я могу поместить свой метод C # в другой класс, поскольку он использует TryFindResource для получения XmlDataProvider из моего XAML.

1 Ответ

1 голос
/ 03 августа 2010

Корень проблемы здесь в том, что ObjectDataProvider всегда создает новый экземпляр любого объекта, для которого он создан.Так что да, он создаст экземпляр класса NewForm, чей конструктор создаст экземпляр другого ObjectDataProvider, который создает экземпляр класса NewForm, и затем он все время черепахит.

НоДело в том, что ObjectDataProvider на самом деле является просто способом объявления объектов создания и вызова для них методов в XAML, так что вам не нужно делать это в коде позади.Поскольку вы уже создаете объект в программном коде, избегать кодового кода вам не выгодно.Так что просто используйте метод, который создает объект, и добавьте его в словарь ресурсов окна:

// this method no longer needs to return anything, so you can change its signature
private void GetTeamName()
{
    // code that creates the object goes here.
    // and now, instead of "return myObject", do this:
    Resources.Add("getTeamOName");
}
...