c#wpf数据绑定未发生
本文关键字:数据绑定 c#wpf | 更新日期: 2023-09-27 18:28:55
我对c#WPF有点陌生。我一直遵循MVVM模式,一切都设置好了,我的代码似乎工作得很好,但我面临的问题是,当我在xaml文件上绑定数据时,我从get-set属性接收的数据,但绑定似乎已经消失,因为我的文本框上没有显示数据。检查我的代码。
/**********************xaml代码***********************************''
<UserControl x:Class="ILS.debugger.debuggermsg"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:serial="clr-namespace:ILS.VM.Serial_Monitor;assembly=ILS.VM"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBox Text="{Binding Debugger_Recoreded}" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Background="#FFEBD3D3">
</TextBox>
</Grid>
</UserControl>
/***********************视图模型代码******************''
namespace ILS.VM.Serial_Monitor
{
public class serial : NotifyPropertyChanged
{
private string debuger_rec;
public string Debugger_Recoreded
{
get { return debuger_rec; }
set
{
if (this.debuger_rec == value)
return;
this.debuger_rec = value;
i--;
if (i == 0)
{
this.debuger_rec = String.Empty;
i = 1000;
}
this.InvokePropertyChanged("Debugger_Recoreded");
}
}
/***********************模型******************''命名空间ILS
public void OnDebugger(String Receved_Data) //debug message monitor code
{
try
{
this.serialData.Debugger_Recoreded += " " + DateTime.Now + " " + Receved_Data + Environment.NewLine;
this.serialData.Debugger_Recoreded += Environment.NewLine;
}
catch (Exception e)
{
}
}
public class serial : INotifyPropertyChanged
{
private string debuger_rec;
public string Debugger_Recoreded
{
get { return debuger_rec; }
set
{
if (this.debuger_rec == value)
return;
this.debuger_rec = value;
i--;
if (i == 0)
{
this.debuger_rec = String.Empty;
i = 1000;
}
OnPropertyChanged("Debugger_Recoreded");
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
并设置DataContext,在主窗口中输入以下行:
this.DataContext = serialData;
您还可以使用模式方式进行绑定。
<TextBox Text="{Binding Debugger_Recoreded,Mode="Towway"}" />
在代码隐藏(即debuggermsg类)中,您必须实例化并分配一个DataContext:
public debuggermsg()
{
InitializeComponent();
this.DataContext = new serial();
}
它是DataBinding所必需的,因此您将能够与ViewModel的属性进行交互。
然后,像这样修改ViewModel:
public class serial : INotifyPropertyChanged
{
private string debuger_rec;
public string Debugger_Recoreded
{
get { return debuger_rec; }
set
{
if (this.debuger_rec == value)
return;
this.debuger_rec = value;
i--;
if (i == 0)
{
this.debuger_rec = String.Empty;
i = 1000;
}
OnPropertyChanged("Debugger_Recoreded");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
需要实现OnPropertyChanged方法才能将ViewModel属性的修改通知给视图。
那一切都会好起来的。
当实现INotifyPropertyChanged
时,最好使用[CallerMemberName]
属性,它在System.Runtime.CompilerServices
中,因为您不必硬编码调用属性的字符串名称:
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName]string propertyName = "")
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
现在你可以这样写你的财产:
private string debuggerRecorded;
public string DebuggerRecorded
{
get
{
return debuggerRecorded;
}
set
{
if (debuggerRecorded != value)
{
this.debuggerRecorded = value;
i--;
if (i == 0)
{
this.debuggerRecorded = String.Empty;
i = 1000;
}
OnPropertyChanged(); // No argument needed
}
}
}
通过这样做,您不必担心拼写问题,并且将来可以自由更改属性的名称,也不必记住在OnPropertyChanged
中更改名称。
假设您的代码其他一切都正常,您只需要设置DataContext,这通常在MainWindow中完成。例如,像这样:
public partial class MainWindow : Window
{
private Serial viewModel;
public MainWindow()
{
InitializeComponent();
viewModel = new Serial();
this.DataContext = viewModel;
}
}
此外,你可能想用另一个属性写你的文本框:
TextBox Text="{Binding DebuggerRecorded, UpdateSourceTrigger=PropertyChanged}" ...
如果省略最后一部分,则只有当TextBox
失去焦点时,Text
才会更新。