как получить доступ к объекту XAML из класса, отличного от main? - PullRequest
0 голосов
/ 15 июня 2011

Если я попробую «var mainpage new Mainpage ()», я запусту конструктор главной страницы, а затем все поля в объекте XAML вернутся к нулю.Как получить доступ к объектам XAML в silverlight, которые принадлежат другому классу, но являются частью одного и того же пространства имен?

Позвольте мне объяснить на примере.Если вы посмотрите на первый ответ, вот с чем я сталкиваюсь

public class MyPage
{
    MyPage()
    {

      // the constructor makes all the variables from the xaml null
    }

    public TextBox MyTextBox
    {
        get { return SomeTextBox; }
    }
}


public class SomeOtherClass
{
    private void SomeFunction()
    {
        var page = new MyPage();   // this makes the text empty
        var sometext = page.MyTextBox.Text;   // so sometext will be empty
    }
}

Так что все, что пользователь подразумевает при первом запуске программы, при запуске SomeFunction становится нулевым.

Что яСначала попробуем посмотреть, если при создании SomeClass значения помещаются в этот класс.

Если это не удастся, я собираюсь попробовать MVVM.Я видел видео http://www.vimeo.com/8915487 и получил пример кода mvvm

Вот модель:

namespace SimpleMVVM.Model
{
    public class SimpleModel
    { 
        // super easy version
        //public string SomeSimpleValue { get; set; }

        private string _SomeSimpleValue = string.Empty;

        // actually do something version...
        public string SomeSimpleValue
        {
            get
            {
                return "some value";
            }
            set
            {
                _SomeSimpleValue = value;
            }
        }
    }
}

вот вид:

и вот viewmodel.cs

using Simple;
using SimpleMVVM.Model;

namespace SimpleMVVM.ViewModel
{
    public class SimpleViewModel : SimpleViewModelBase
    {
        private SimpleModel MyModel = new SimpleModel(); 

        public string SomeSimpleValue
        {
            get { return MyModel.SomeSimpleValue; }
            set
            {
                if (MyModel.SomeSimpleValue != value)
                {
                    MyModel.SomeSimpleValue = value;
                    RaisePropertyChanged("SomeSimpleValue");
                }
            }
        } 
    }
}

Используя этот пример, мне интересно, будет ли это так же просто, как внедрение ViewModel, а затем изменение привязок в модели и представлении.

Действительно ли MVVM так прост?

Есть еще один.Это базовый класс viewmodel

using System.ComponentModel;

namespace Simple
{
    public class SimpleViewModelBase : INotifyPropertyChanged
    { 
        public event PropertyChangedEventHandler PropertyChanged;

        public void RaisePropertyChanged(string PropertyName)
        {
            var e = new PropertyChangedEventArgs(PropertyName);
            PropertyChangedEventHandler changed = PropertyChanged;
            if (changed != null) changed(this, e);
        }
    }
}

ОК, теперь сложная часть.Если я создам новый класс.Как получить данные из класса viewmodel?

1 Ответ

3 голосов
/ 15 июня 2011

Во-первых, позвольте мне убрать эту напыщенную речь: вы предлагаете очень плохой дизайн.Он соответствует определению вонючего кода .

Если вы настаиваете на том, чтобы делать это таким образом, «лучшим» подходом является объявление на вашей странице некоторых открытых переменных, которые возвращают фактический пользовательский интерфейс.elements.

<UserControl x:Class="MyNamespace.MyPage"  ...>
    <Grid>
        <TextBox x:Name="SomeTextBox" Width="100" />
    </Grid>
</UserControl>


public class MyPage
{
    public TextBox MyTextBox
    {
        get { return SomeTextBox; }
    }
}


public class SomeOtherClass
{
    private void SomeFunction()
    {
        var page = new MyPage();
        page.MyTextBox.Text = "some text";
    }
}

Конечно, предпочтительным методом было бы использовать что-то вроде шаблона MVVM для реализации привязки вашего окна к его viewmodel, тогда вы можете просто прочитать значения свойств из viewmodel, таким образом выСтарайтесь не трогать любые элементы пользовательского интерфейса совершенно другого класса.

Другой способ сделать это (без прохождения полного маршрута MVVM) - ввести необходимые значения в конструктор создаваемого вами элемента управления / страницы, и оттуда вы можете назначить их соответствующему элементу пользовательского интерфейса.свойства.Это все еще вонючий, но лучше, чем прямой доступ к элементам интерфейса извне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...