绑定未显示正确的值

时间:2013-04-19 14:29:18

标签: c# wpf data-binding

基本上,我正在从xml文件中读取值并在文本框中显示该值。此文本框是可编辑的,因此用户可以对其进行更改,并在会话结束时将该值存储回xml文件中。

我知道值正确存储并加载到文本框中。但我很困惑,为什么我看不到应该在文本框中显示的绑定值..

这是文本框:

<UserControl x:Class="test.myView"
         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:ui="clr-namespace:test.myView"  
         xmlns:local="test.myControls;assembly=test.mycontrols">

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Style.xaml"/>
    </ResourceDictionary>
</UserControl.Resources>

<StackPanel Margin="8">
        <TextBlock Text="Starting URL"/>
        <TextBox Margin="0,5" FontSize="12" Height="30" Width="360" Text="{Binding myValue, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                 Style="{StaticResource WaterMarkTextBox}" local:WaterMarkTextHelper.WatermarkText="ENTER Value" />
    </StackPanel>

这是INotifyPropertyChanged:

public abstract class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaiseChangeNotification(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

}

这是我绑定的属性:

public string myValue
    {
        get { return _settings.myValue; }
        set { _settings.myValue= value;   }
    }

我认为这可能是因为在代码到达使用数据绑定设置起始URL的部分之前,文本框的值为空。在wpf中是否存在强制它查看最新值的验证命令?

2 个答案:

答案 0 :(得分:1)

没有足够的信息来了解确切的问题,但在发生这类事情时,有一些事情需要检查。

  1. 检查Visual Studio中的Output窗口。这将给你任何绑定错误。这有助于解决以下一些问题:

    • 未将您的媒体资源设为public

    • 错字与你的财产名称

    • 没有DataContext设置

  2. 确保DataContext实现INotifyPropertyChanged界面。这是实现WPF以更新绑定所必需的。你会这样做:

    public class YourDataContext : INotifyPropertyChanged
    {
        private object _myvalue;
    
        public object myvalue
        {
            get
            {
                return _myvalue;
            }
            set
            {
                if (_myvalue == value)
                    return;
    
                _myvalue = value;
                OnPropertyChanged("myvalue");
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        public void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, 
                                new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    

    您还可以查找几种策略来简化此操作,例如INotifyPropertyChanged编织或BaseViewModel类。

  3. 修改

    如果您myvalue中的ViewModel继承自ViewModelBase,那么您需要做的就是将您的资产的实施更改为:

    public string myValue
    {
        get 
        {
            return _settings.myValue;
        }
        set 
        {
            if (_settings.myValue == value)
                return;
    
            _settings.myValue = value;
            RaiseChangeNotification("myValue");            
        }
    }
    

答案 1 :(得分:0)

尝试添加一个虚拟转换器,并查看从UI文本框更改值时是否会触发绑定(需要执行转换方法)。否则,请采取窥探(http://snoopwpf.codeplex.com/)的帮助。这将帮助您检查绑定的状态。

如果要将数据从源更新为目标,请在setter中添加RaiseNotification。

public string myValue
    {
        get { return _settings.myValue; }
        set { _settings.myValue= value;  RaiseChangeNotification("myValue") }
    }