在WPF中的MainWindow和自定义类之间进行通信

时间:2014-03-22 10:02:50

标签: c# wpf xaml

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

5 个答案:

答案 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。

参考:http://blogs.msdn.com/b/msgulfcommunity/archive/2013/03/13/understanding_2d00_the_2d00_basics_2d00_of_2d00_mvvm_2d00_design_2d00_pattern.aspx

答案 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);
 }