0

基本上,我正在从 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 中是否存在强制它查看最新值的验证命令?

4

2 回答 2

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类。

编辑

如果myvalue在你ViewModel的继承自你的,ViewModelBase那么你需要做的就是将你的属性的实现更改为:

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

        _settings.myValue = value;
        RaiseChangeNotification("myValue");            
    }
}
于 2013-04-19T14:42:27.357 回答
0

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

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

public string myValue
    {
        get { return _settings.myValue; }
        set { _settings.myValue= value;  RaiseChangeNotification("myValue") }
    }
于 2013-04-19T15:01:37.233 回答