我是c#和XAML的新手。我正在尝试做一个WPF项目,其中将有大量的数据绑定。现在,我能够做单向数据绑定没有任何问题,我面临的问题是,当我试图做双向数据绑定。
这是我的Xaml文件的开始,我试图将文本框绑定到静态类中的静态属性:
<Window x:Class="interactive_fountain.MainWindow"
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:interactive_fountain"
xmlns:include="clr-namespace:interactive_fountain.Include"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<TextBox x:Name="ip_textBox" HorizontalAlignment="Left" Height="27" Margin="250,242,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="110" Text="{Binding Source={x:Static include:Communication.ipAddressServer}, Path=include:Communication.ipAddressServer, UpdateSourceTrigger=PropertyChanged}"/>
<Button Content="Button" HorizontalAlignment="Left" Margin="221,131,0,0" VerticalAlignment="Top" Height="47" Width="139" Click="Button_Click_1"/>
...
这是c#主窗口代码的开始:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
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.Net;
using System.Net.Sockets;
using System.Diagnostics;
using interactive_fountain.Include;
namespace interactive_fountain
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Trace.WriteLine("ip: " + Communication.ipAddressServer);
}
...
这是我想要做数据绑定的类的开始:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;
namespace interactive_fountain.Include
{
public static class Communication
{
public static string ipAddressServer = "hello";
...
每当我尝试进行双向数据绑定时,占位符"hello"不再出现。当我在textBox中写入并按下按钮时,无论我在框中写入什么,输出将始终是ip: hello。我看了很多关于这个问题的线程,但我没有找到一个解决方案,为我工作。有谁知道我该怎么做吗?
提前谢谢! !
-
WPF数据绑定仅适用于公共属性,您的
ipAddressServer
是静态字段(又名类变量)而不是属性,因此不会使用它。它也没有遵循正确的命名约定。 -
你的混乱的绑定是旧风格的静态绑定,使用
{Binding Path=(w:Communication.IpAddressServer)}
代替(在你修复#1之后,当然)。w
是相关的XAML命名空间定义。 -
静态属性没有标准的更改通知,因为静态类不能实现接口(我希望原因很明显)。相反,WPF使用基于约定的方法,使用公共静态事件
PropertyChangedEventHandler StaticPropertyChanged
并调用它来通知更改。不清楚你是否希望你的属性是可变的,但你明确地提到了更改通知机制,所以就把它扔在那里。