C# 如何从main以外的类访问XAML对象?
如果我尝试“var mainpage new mainpage()” 我将运行mainpage构造函数,然后XAML对象中的所有字段都将返回null。如何在silverlight中访问来自不同类但属于同一命名空间的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
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模式,但现在就可以了。如果你愿意,那就去做吧