Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从main以外的类访问XAML对象?_C#_Silverlight_Xaml - Fatal编程技术网

C# 如何从main以外的类访问XAML对象?

C# 如何从main以外的类访问XAML对象?,c#,silverlight,xaml,C#,Silverlight,Xaml,如果我尝试“var mainpage new mainpage()” 我将运行mainpage构造函数,然后XAML对象中的所有字段都将返回null。如何在silverlight中访问来自不同类但属于同一命名空间的XAML对象 让我举例说明。如果你看第一个答案,下面是我遇到的 public class MyPage { MyPage() { // the constructor makes all the variables from the xaml null

如果我尝试“var mainpage new mainpage()” 我将运行mainpage构造函数,然后XAML对象中的所有字段都将返回null。如何在silverlight中访问来自不同类但属于同一命名空间的XAML对象

让我举例说明。如果你看第一个答案,下面是我遇到的

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时变为null

我首先要尝试的是,当创建某个类时,是否将值放入该类中

如果失败,我将尝试MVVM。我看过视频,得到了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类中获取数据?

首先,让我把这句话放在一边:你提出的设计非常糟糕。它符合的定义

如果您坚持这样做,“最好”的方法是在页面上声明一些公共变量,这些变量返回实际的UI元素

<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";
    }
}

公共类MyPage
{
公共文本框MyTextBox
{
获取{return SomeTextBox;}
}
}
公共类其他类
{
私有函数()
{
var page=new MyPage();
page.MyTextBox.Text=“一些文本”;
}
}
当然,首选的方法是使用类似MVVM模式的东西来实现从窗口到其viewmodel的绑定,然后您可以从viewmodel中读取属性值,这样您就可以避免尝试接触来自完全不同类的任何UI元素

另一种方法(不使用完整的MVVM路径)是将必要的值注入到正在实例化的控件/页面的构造函数中,然后从那里可以将它们分配给适当的UI元素属性。这仍然很难闻,但比直接从外部访问UI元素要好。

首先,让我把这句话放在一边:你提出的设计非常糟糕。它符合的定义

如果您坚持这样做,“最好”的方法是在页面上声明一些公共变量,这些变量返回实际的UI元素

<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";
    }
}

公共类MyPage
{
公共文本框MyTextBox
{
获取{return SomeTextBox;}
}
}
公共类其他类
{
私有函数()
{
var page=new MyPage();
page.MyTextBox.Text=“一些文本”;
}
}
当然,首选的方法是使用类似MVVM模式的东西来实现从窗口到其viewmodel的绑定,然后您可以从viewmodel中读取属性值,这样您就可以避免尝试接触来自完全不同类的任何UI元素


另一种方法(不使用完整的MVVM路径)是将必要的值注入到正在实例化的控件/页面的构造函数中,然后从那里可以将它们分配给适当的UI元素属性。这仍然很难闻,但比直接从外部访问UI元素要好。

您给出的代码示例的问题正是我遇到的问题。我认为MyPage有一个构造函数方法。当您调用“var page=new MyPage();”时,您将调用MyPage类的构造函数。此构造函数使SomeTextBox中的所有值都为null。如果您想在MyTextBox中设置文本,这很好,但我想做相反的事情。我想阅读已经存在的文本。我将编辑我的原始帖子。我想我会继续使用MVVM来做这件事,因为我看不到任何其他方法work@xarzu-当你说我想阅读已经存在的文本时,你错了-那里还没有文本,因为页面还没有创建,那里不可能有任何文本,而且对于建设者来说,将文本放在那里只是为了使其无效是荒谬的。听起来页面在构造函数运行后正在检索文本(或放置默认文本),可能是在OnLoad或OnShow事件处理程序中。您给出的代码示例的问题正是我遇到的问题。我认为MyPage有一个构造函数方法。当您调用“var page=new MyPage();”时,您将调用MyPage类的构造函数。此构造函数使SomeTextBox中的所有值都为null。如果您想在MyTextBox中设置文本,这很好,但我想做相反的事情。我想阅读已经存在的文本。我将编辑我的原始帖子。我想我会继续使用MVVM来做这件事,因为我看不到任何其他方法work@xarzu-当你说我想阅读已经存在的文本时,你错了-那里还没有文本,因为页面还没有创建,那里不可能有任何文本,而且对于建设者来说,将文本放在那里只是为了使其无效是荒谬的。这听起来像是在构造函数运行后,页面正在检索文本(或放置默认文本),可能是在OnLoad或OnShow事件处理程序中。是的,MVVM就是这么简单(当您需要处理诸如按钮单击之类的UI操作时,它会变得更复杂)。就我个人而言,我不同意您上面展示的MVVM模式,但现在就可以了。如果你还有其他问题,那就去问吧。是的,MVVM就是这么简单(当你需要处理像点击按钮这样的UI操作时,它会变得更复杂)。就我个人而言,我不同意您上面展示的MVVM模式,但现在就可以了。如果你愿意,那就去做吧