C#WPF怎么将一个控件与自定义结构体属性关联?

如下图,就是Room的类型是自定义类,有Room.x,Room.y,Room.z;我控件一次改变的时候只能改变Room.x,Room.y,Room.z中的一个值撒。。但是... 如下图,就是Room的类型是自定义类,有Room.x,Room.y,Room.z;
我控件一次改变的时候只能改变Room.x,Room.y,Room.z中的一个值撒。。但是我要控件值改变的时候触发Room的set函数
展开
 我来答
匿名用户
2019-08-23
展开全部


private double x;

        public double X {
get { return x; }
set {
x = value;
set();//每次赋值时都调用 set()
}
}

        private double y;

        public double Y {
get { return y; }
set {
y = value;
set();//每次赋值时都调用 set()
}
}

private double z;

        public double Z {
get { return z; }
set {
z = value;
set();//每次赋值时都调用 set()
}
}


在属性中,每次赋值(调用 set)时,都调用一次 set() 就好了

追问
这个没问题。我没说清楚,不好意思哈,嗯。现在的问题是x. y. z是一个类。。然后room是另一个类里面的以xyz这个类为类型的自定义结构体变量。所以绑定的时候只触发了xyz的set。没有触发room的set
追风剑情
2019-08-23 · 超过20用户采纳过TA的回答
知道答主
回答量:69
采纳率:40%
帮助的人:7.2万
展开全部

给你写个示例吧

MainWindow.xaml

<Window

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:WpfTest"

        xmlns:Properties="clr-namespace:WpfTest.Properties" x:Class="WpfTest.MainWindow"

        mc:Ignorable="d"

        Title="MainWindow" Height="450" Width="800">

    <Grid Margin="0,0,0,0">

        <Label Content="X" HorizontalAlignment="Left" Margin="20,14,0,0" VerticalAlignment="Top"/>

        <Label Content="Y" HorizontalAlignment="Left" Margin="20,43,0,0" VerticalAlignment="Top"/>

        <Label Content="Z" HorizontalAlignment="Left" Margin="21,75,0,0" VerticalAlignment="Top"/>

        <!--重点是UpdateSourceTrigger=PropertyChanged, Mode=TwoWay-->

        <TextBox Name="textBox_X" Text="{Binding X, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" HorizontalAlignment="Left" Height="23" Margin="45,14,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>

        <TextBox Name="textBox_Y" Text="{Binding Y, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" HorizontalAlignment="Left" Height="23" Margin="45,45,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>

        <TextBox Name="textBox_Z" Text="{Binding Z, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" HorizontalAlignment="Left" Height="23" Margin="45,76,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" IsEnabled="False"/>

    </Grid>

</Window>

MainWindow.xaml.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;

using System.ComponentModel;//INotifyPropertyChanged

using System.Threading.Tasks;


namespace WpfTest

{

    /// <summary>

    /// MainWindow.xaml 的交互逻辑

    /// </summary>

    public partial class MainWindow : Window

    {

        private Room room = new Room();


        public MainWindow()

        {

            InitializeComponent();


            this.textBox_X.DataContext = room;

            this.textBox_Y.DataContext = room;

            this.textBox_Z.DataContext = room;

        }

    }


    public class Room : DependencyObject

    {

        public int X

        {

            get { return (int)GetValue(XProperty); }

            set {

                SetValue(XProperty, value);

                Console.WriteLine("set X={0}", value);

            }

        }


        public int Y

        {

            get { return (int)GetValue(YProperty); }

            set

            {

                SetValue(YProperty, value);

                Console.WriteLine("set Y={0}", value);

            }

        }


        public int Z

        {

            get { return (int)GetValue(ZProperty); }

            set

            {

                SetValue(ZProperty, value);

                Console.WriteLine("set Z={0}", value);

            }

        }


        // UI控件的值变化时回调

        private static void OnPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)

        {

            Room room = d as Room;

            switch (e.Property.Name)

            {

                case "X": room.X = (int)e.NewValue; break;

                case "Y": room.Y = (int)e.NewValue; break;

                case "Z": room.Z = (int)e.NewValue; break;

            }

        }


        public static readonly DependencyProperty XProperty =

        DependencyProperty.Register(

            "X",

            typeof(int),

            typeof(Room),

            new PropertyMetadata(0, OnPropertyChangedCallback, null)

        );


        public static readonly DependencyProperty YProperty =

        DependencyProperty.Register(

            "Y",

            typeof(int),

            typeof(Room),

            new PropertyMetadata(0, OnPropertyChangedCallback, null)

        );


        public static readonly DependencyProperty ZProperty =

        DependencyProperty.Register(

            "Z",

            typeof(int),

            typeof(Room),

            new PropertyMetadata(0, OnPropertyChangedCallback, null)

        );

    }

}

示例原文及运行效果参见我的博客 WPF—数据双向绑定

追问
这个没问题。我没说清楚,不好意思哈,嗯。现在的问题是x. y. z是一个类。。然后room是另一个类里面的以xyz这个类为类型的自定义结构体变量。所以绑定的时候只触发了xyz的set。没有触发room的set
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式