在WPF中MainWindow
和其他自定义类之间进行通信的最佳方式是什么?
我们说我们有这种结构。
- MainWindow.xaml
MainWindow.xaml.cs
- MyClass.cs
我在Class1.cs
中使用了MainWindow.xaml
,如下所示:
<drawings:MyClass>
.
.
.
</drawings:MyClass>
在MyClass
我有一个名为X
的变量,现在从MainWindow.xaml.cs
访问此变量的最佳方式是什么?
我知道我在这里遗漏了一些关于面向对象编程的非常明显的东西,我只是不知道它是什么。
更新 这是我到目前为止所提出的代码,但它并不起作用。而TextBlock的价值并没有改变。
XAML:
<Window x:Class="CustomClasses.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:customclasses="clr-namespace:CustomClasses"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<customclasses:MyClass></customclasses:MyClass>
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition Height="150"></RowDefinition>
</Grid.RowDefinitions>
<customclasses:MyClass Width="525" Height="350" Background="Blue">
</customclasses:MyClass>
<StackPanel Grid.Row="1">
<TextBlock Text="{Binding X, Mode=TwoWay}"></TextBlock>
</StackPanel>
</Grid>
</Window>
MyClass的:
using System.Windows.Controls;
using System.Windows.Input;
namespace CustomClasses
{
class MyClass : Border
{
public double X { get; set; }
public MyClass()
{
MouseMove += MyMouseMove;
}
private void MyMouseMove(object sender, MouseEventArgs e)
{
var b = (Border) sender;
X = Mouse.GetPosition(b).X;
}
}
}
答案 0 :(得分:1)
如果您尝试从cs文件中的另一个类访问它,那么您需要创建类的对象并访问变量
MyClass _m=new MyClass();
_m.x=//Your value
但是,如果您尝试从.cs
文件访问XAML
然后您可以将变量添加为资源。
MainWindow.Resources.Add("resourceKey",_yourvariable);
和XAML
<TextBlock Text="{StaticResource resourceKey}"/>
答案 1 :(得分:1)
如果您计划在MainWindow内以及整个项目中使用MyClass的方法/变量,
您可以在MainWindow类中声明一个成员,如下所示:
private static MyClass _myClassVar = null;
public static MyClass myClassVar
{
get
{
if (_myClassVar == null)
_myClassVar = new MyClass();
return _myClassVar;
}
}
然后,您可以将MyClass的公共成员称为:
MainWindow.myClassVar.X
正如我从评论中读到的那样
如果您需要捕获MyClass变量的变化,请阅读 INotifyPropertyChanged 界面。
HTH
答案 2 :(得分:1)
在MainWindow.xaml
<Window .......
xmlns:drawings="clr-namespace:YourAppName.FolderName(If YourClass In folder)">
<Window.DataContext>
<drawings:MyClass> //MyClass is the name of the class
</Window.DataContext>
.
.
.
<TextBox Text={Binding X,Mode=TowWay} . . . . />
</Window>
在你的MyClass中
public class MyClass
{
_private int _x;
public int X
{
get;
set;
}
}
现在,如果你在这里为X赋值将绑定到TextBox。
答案 3 :(得分:1)
如果您有兴趣访问您在Grid中声明的实例的X
,那么
<customclasses:MyClass Width="525" Height="350" Background="Blue">
</customclasses:MyClass>
我想在此实例上设置x:Name
,然后您可以使用此名称在后面的代码中访问它。
<customclasses:MyClass x:Name="myClass" Width="525" Height="350"
Background="Blue"/>
在后面的代码中,您可以像这样访问它:
double value = myClass.X;
如果有兴趣为DataContext实例获取X,即
<Window.DataContext>
<customclasses:MyClass></customclasses:MyClass>
</Window.DataContext>
你可以在这样的代码中获得价值:
double value = ((MyClass)DataContext).X;
声明为DataContext且在Grid下定义的所有MyClass
的第一个是两个独立的实例。删除DataContext并使用ElementName
与在Grid中声明的实例绑定。
<强> XAML 强>
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition Height="150"></RowDefinition>
</Grid.RowDefinitions>
<local:MyClass x:Name="myClass" Width="525" Height="350" Background="Blue"/>
<StackPanel Grid.Row="1">
<TextBlock Text="{Binding X, ElementName=myClass}"></TextBlock>
</StackPanel>
</Grid>
用于更新班级MyClass
的用户界面第二次应实施INotifyPropertyChanged,以便UI属性的任何更改都会反映在用户界面上。
<强> MyClass的强>:
class MyClass : Border, INotifyPropertyChanged
{
private double x;
public double X
{
get { return x; }
set
{
if (x != value)
{
x = value;
RaisePropertyChanged("X");
}
}
}
public MyClass()
{
MouseMove += MyMouseMove;
}
private void MyMouseMove(object sender, MouseEventArgs e)
{
var b = (Border)sender;
X = Mouse.GetPosition(b).X;
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
答案 4 :(得分:0)
simple ...在MyClass中将变量声明为static并在MainWindow.xaml.cs中使用它
class MyClass
{
//public static int x=10;
public int x;
public MyClass()
{
x=10;
}
}
public MainWindow.xaml.cs
{
//messageBox.show("x="+MyClass.x);
Myclass obj=new MyClass();
messageBox.show("x="+obj.x);
}