C# 绑定到文本框会引发绑定异常错误
我正在尝试将文本框绑定到公共字符串字段,以筛选wpf列表框中的项目列表。我一直在犯这个错误。这是一个相当简单的设置。代码如下。我觉得代码本身相当简单,我不清楚问题出在哪里。谢谢你的帮助 出于某种原因,我的列表总是空的,它应该首先显示所有州的名称,然后如果搜索框包含文本,它会过滤列表 System.Windows.Data错误:8:无法将值从目标保存回 来源。BindingExpression:Path=SearchText; DataItem='MainWindowViewModel'(HashCode=37975124);目标元素是 “TextBox”(Name='SearchBox');目标属性为“文本”(类型 'String')NullReferenceException:'System.NullReferenceException: 对象引用未设置为对象的实例 VNode.csC# 绑定到文本框会引发绑定异常错误,c#,wpf,xaml,C#,Wpf,Xaml,我正在尝试将文本框绑定到公共字符串字段,以筛选wpf列表框中的项目列表。我一直在犯这个错误。这是一个相当简单的设置。代码如下。我觉得代码本身相当简单,我不清楚问题出在哪里。谢谢你的帮助 出于某种原因,我的列表总是空的,它应该首先显示所有州的名称,然后如果搜索框包含文本,它会过滤列表 System.Windows.Data错误:8:无法将值从目标保存回 来源。BindingExpression:Path=SearchText; DataItem='MainWindowViewModel'(Ha
namespace WpfApplication1
{
public class VNode
{
public string Name { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace WpfApplication1
{
public class MainWindowViewModel : ObservableObject
{
private ObservableCollection<VNode> _vnodes;
public ObservableCollection<VNode> VNodes
{
get { return _vnodes; }
set
{
_vnodes = value;
NotifyPropertyChanged("VNodes");
}
}
private ObservableCollection<VNode> _vnodesfiltered;
public ObservableCollection<VNode> VNodesFiltered
{
get { return _vnodesfiltered; }
set
{
_vnodesfiltered = value;
NotifyPropertyChanged("VNodesFiltered");
}
}
public MainWindowViewModel()
{
VNodes = new ObservableCollection<VNode>();
// data testing
List<string> names = new List<string>() { "Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "DistrictofColumbia", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "NewHampshire", "NewJersey", "NewMexico", "NewYork", "NorthCarolina", "NorthDakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "RhodeIsland", "SouthCarolina", "SouthDakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "WestVirginia", "Wisconsin", "Wyoming" };
foreach (string name in names)
{
var node = new VNode();
node.Name = name;
VNodes.Add(node);
}
}
private string _searchText = "";
public string SearchText
{
get { return _searchText; }
set
{
if (value != _searchText)
{
_searchText = value;
VNodesFiltered.Clear();
if (string.IsNullOrWhiteSpace(SearchText))
{
foreach (var node in VNodes)
{
VNodesFiltered.Add(node);
}
}
else
{
foreach (var node in VNodes)
{
if (node.Name.Contains(SearchText))
{
VNodesFiltered.Add(node);
}
}
}
}
}
}
}
}
可观察对象.cs
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace WpfApplication1
{
public class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
MainWindowViewModel.cs
namespace WpfApplication1
{
public class VNode
{
public string Name { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace WpfApplication1
{
public class MainWindowViewModel : ObservableObject
{
private ObservableCollection<VNode> _vnodes;
public ObservableCollection<VNode> VNodes
{
get { return _vnodes; }
set
{
_vnodes = value;
NotifyPropertyChanged("VNodes");
}
}
private ObservableCollection<VNode> _vnodesfiltered;
public ObservableCollection<VNode> VNodesFiltered
{
get { return _vnodesfiltered; }
set
{
_vnodesfiltered = value;
NotifyPropertyChanged("VNodesFiltered");
}
}
public MainWindowViewModel()
{
VNodes = new ObservableCollection<VNode>();
// data testing
List<string> names = new List<string>() { "Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "DistrictofColumbia", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "NewHampshire", "NewJersey", "NewMexico", "NewYork", "NorthCarolina", "NorthDakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "RhodeIsland", "SouthCarolina", "SouthDakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "WestVirginia", "Wisconsin", "Wyoming" };
foreach (string name in names)
{
var node = new VNode();
node.Name = name;
VNodes.Add(node);
}
}
private string _searchText = "";
public string SearchText
{
get { return _searchText; }
set
{
if (value != _searchText)
{
_searchText = value;
VNodesFiltered.Clear();
if (string.IsNullOrWhiteSpace(SearchText))
{
foreach (var node in VNodes)
{
VNodesFiltered.Add(node);
}
}
else
{
foreach (var node in VNodes)
{
if (node.Name.Contains(SearchText))
{
VNodesFiltered.Add(node);
}
}
}
}
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
命名空间WpfApplication1
{
公共类MainWindowViewModel:ObserveObject
{
私有可观测收集节点;
公共可观测收集节点
{
获取{return\u vnodes;}
设置
{
_vnodes=值;
NotifyPropertyChanged(“VNodes”);
}
}
私有可观测集合_vnodes;
已筛选的公共可观测集合
{
获取{return}
设置
{
_vnodesfiltered=值;
NotifyPropertyChanged(“VNodesFiltered”);
}
}
公共主窗口视图模型()
{
VNodes=新的ObservableCollection();
//数据测试
列表名称=新列表(){“阿拉巴马州”、“阿拉斯加”、“亚利桑那州”、“阿肯色州”、“加利福尼亚州”、“科罗拉多州”、“康涅狄格州”、“特拉华州”、“哥伦比亚特区”、“佛罗里达州”、“乔治亚州”、“夏威夷州”、“爱达荷州”、“伊利诺伊州”、“印第安纳州”、“爱荷华州”、“堪萨斯州”、“肯塔基州”、“路易斯安那州”、“缅因州”、“马里兰州”、“马萨诸塞州”、“密歇根州”、“明尼苏达州”、“密西西比州”、“密苏里州”,“蒙大拿州”、“内布拉斯加州”、“内华达州”、“新罕布什尔州”、“新泽西州”、“新墨西哥州”、“纽约州”、“北卡罗来纳州”、“北达科他州”、“俄亥俄州”、“俄克拉荷马州”、“俄勒冈州”、“宾夕法尼亚州”、“罗德岛州”、“南卡罗来纳州”、“南达科他州”、“田纳西州”、“德克萨斯州”、“犹他州”、“佛蒙特州”、“弗吉尼亚州”、“华盛顿州”、“西弗吉尼亚州”、“威斯康星州”、“怀俄明州”};
foreach(名称中的字符串名称)
{
var node=new VNode();
node.Name=Name;
添加(节点);
}
}
私有字符串_searchText=“”;
公共字符串搜索文本
{
获取{return\u searchText;}
设置
{
如果(值!=\u搜索文本)
{
_搜索文本=值;
VNodesFiltered.Clear();
if(string.IsNullOrWhiteSpace(SearchText))
{
foreach(VNodes中的var节点)
{
添加(节点);
}
}
其他的
{
foreach(VNodes中的var节点)
{
if(node.Name.Contains(SearchText))
{
添加(节点);
}
}
}
}
}
}
}
}
main window.xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="200" Width="200"
WindowStartupLocation="CenterScreen">
<Window.DataContext>
<local:MainWindowViewModel />
</Window.DataContext>
<Grid>
<ListBox>
<ListBox.ContextMenu>
<ContextMenu FocusManager.FocusedElement="{Binding ElementName=SearchBox}">
<ContextMenu.Template>
<ControlTemplate>
<Border BorderThickness="2" BorderBrush="sc#1,.1,.1,.1" CornerRadius="4"
Background="sc#1,.05,.05,.05">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBox Grid.Row="0" Margin="4" MinWidth="150" Name="SearchBox" VerticalAlignment="Center"
Text="{Binding SearchText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
</TextBox>
<ListBox Grid.Row="1" MinWidth="150" MaxHeight="300" ItemsSource="{Binding VNodes}">
<ListBox.ItemTemplate>
<DataTemplate>
<WrapPanel>
<TextBlock Text="{Binding Name}" FontWeight="Regular" FontSize="12" />
</WrapPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Border>
</ControlTemplate>
</ContextMenu.Template>
</ContextMenu>
</ListBox.ContextMenu>
</ListBox>
</Grid>
</Window>
您没有实例化VNodesFiltered
集合-它是null
您没有初始化\VNodesFiltered
TextBox
调用SearchText
的setter。此setter调用VNodesFiltered.Clear();
。但是由于\VNodesFiltered
为空,因此VNodesFiltered
也为空。因此,
vNodeFiltered.Clear();
抛出一个NullPointerException
因为与绑定表达式相关的setter抛出异常,所以它无法将值写入源,这正是异常所说的
“无法将值从目标保存回源”
解决方案是在构造函数中初始化\u vnodesfiltered
:
public MainWindowViewModel()
{
VNodes = new ObservableCollection<VNode>();
_vnodesfiltered = new ObservableCollection<VNode>();
// data testing
List<string> names = new List<string>() { "Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "DistrictofColumbia", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "NewHampshire", "NewJersey", "NewMexico", "NewYork", "NorthCarolina", "NorthDakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "RhodeIsland", "SouthCarolina", "SouthDakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "WestVirginia", "Wisconsin", "Wyoming" };
foreach (string name in names)
{
var node = new VNode();
node.Name = name;
VNodes.Add(node);
}
}
public主窗口视图模型()
{
VNodes=新的ObservableCollection();
_vnodesfiltered=新的ObservableCollection();
//数据测试
列表名称=新列表(){“阿拉巴马州”、“阿拉斯加”、“亚利桑那州”、“阿肯色州”、“加利福尼亚州”、“科罗拉多州”、“康涅狄格州”、“特拉华州”、“哥伦比亚特区”、“佛罗里达州”、“乔治亚州”、“夏威夷州”、“爱达荷州”、“伊利诺伊州”、“印第安纳州”、“爱荷华州”、“堪萨斯州”、“肯塔基州”、“路易斯安那州”、“缅因州”、“马里兰州”、“马萨诸塞州”、“密歇根州”,