Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绑定到文本框会引发绑定异常错误_C#_Wpf_Xaml - Fatal编程技术网

C# 绑定到文本框会引发绑定异常错误

C# 绑定到文本框会引发绑定异常错误,c#,wpf,xaml,C#,Wpf,Xaml,我正在尝试将文本框绑定到公共字符串字段,以筛选wpf列表框中的项目列表。我一直在犯这个错误。这是一个相当简单的设置。代码如下。我觉得代码本身相当简单,我不清楚问题出在哪里。谢谢你的帮助 出于某种原因,我的列表总是空的,它应该首先显示所有州的名称,然后如果搜索框包含文本,它会过滤列表 System.Windows.Data错误:8:无法将值从目标保存回 来源。BindingExpression:Path=SearchText; DataItem='MainWindowViewModel'(Ha

我正在尝试将文本框绑定到公共字符串字段,以筛选wpf列表框中的项目列表。我一直在犯这个错误。这是一个相当简单的设置。代码如下。我觉得代码本身相当简单,我不清楚问题出在哪里。谢谢你的帮助

出于某种原因,我的列表总是空的,它应该首先显示所有州的名称,然后如果搜索框包含文本,它会过滤列表

System.Windows.Data错误:8:无法将值从目标保存回 来源。BindingExpression:Path=SearchText; DataItem='MainWindowViewModel'(HashCode=37975124);目标元素是 “TextBox”(Name='SearchBox');目标属性为“文本”(类型 'String')NullReferenceException:'System.NullReferenceException: 对象引用未设置为对象的实例

VNode.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);
                            }
                        }
                    }
                }
            }
        }

    }
}
可观察对象.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();
//数据测试
列表名称=新列表(){“阿拉巴马州”、“阿拉斯加”、“亚利桑那州”、“阿肯色州”、“加利福尼亚州”、“科罗拉多州”、“康涅狄格州”、“特拉华州”、“哥伦比亚特区”、“佛罗里达州”、“乔治亚州”、“夏威夷州”、“爱达荷州”、“伊利诺伊州”、“印第安纳州”、“爱荷华州”、“堪萨斯州”、“肯塔基州”、“路易斯安那州”、“缅因州”、“马里兰州”、“马萨诸塞州”、“密歇根州”,