基本上,我正在从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中是否存在强制它查看最新值的验证命令?
答案 0 :(得分:1)
没有足够的信息来了解确切的问题,但在发生这类事情时,有一些事情需要检查。
检查Visual Studio中的Output
窗口。这将给你任何绑定错误。这有助于解决以下一些问题:
未将您的媒体资源设为public
错字与你的财产名称
没有DataContext
设置
确保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");
}
}
答案 1 :(得分:0)
尝试添加一个虚拟转换器,并查看从UI文本框更改值时是否会触发绑定(需要执行转换方法)。否则,请采取窥探(http://snoopwpf.codeplex.com/)的帮助。这将帮助您检查绑定的状态。
如果要将数据从源更新为目标,请在setter中添加RaiseNotification。
public string myValue
{
get { return _settings.myValue; }
set { _settings.myValue= value; RaiseChangeNotification("myValue") }
}