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)
            {
            }
        }

c#wpf数据绑定未发生

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才会更新。