Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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_Data Binding - Fatal编程技术网

C# 为什么我的文本框中的数据绑定不起作用?

C# 为什么我的文本框中的数据绑定不起作用?,c#,wpf,data-binding,C#,Wpf,Data Binding,我在文本框中的数据绑定不起作用。在另一个窗口中,我在GridView上有相同的绑定,这很有效。它们具有相同的数据上下文。在调试时将TraceLevel设置为high之后,我收到了一些警告。但他们并没有真正帮助我: System.Windows.Data Warning: 56 : Created BindingExpression (hash=14200498) for Binding (hash=9369539) System.Windows.Data Warning: 58 : Path:

我在文本框中的数据绑定不起作用。在另一个窗口中,我在GridView上有相同的绑定,这很有效。它们具有相同的数据上下文。在调试时将TraceLevel设置为high之后,我收到了一些警告。但他们并没有真正帮助我:

System.Windows.Data Warning: 56 : Created BindingExpression (hash=14200498) for Binding (hash=9369539)
System.Windows.Data Warning: 58 :  Path: 'KundeVM.Skunde.Plz'
System.Windows.Data Warning: 62 : BindingExpression (hash=14200498): Attach to System.Windows.Controls.TextBox.Text (hash=2601186)
System.Windows.Data Warning: 67 : BindingExpression (hash=14200498): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=14200498): Found data context element: TextBox (hash=2601186) (OK)
System.Windows.Data Warning: 78 : BindingExpression (hash=14200498): Activate with root item AppViewModel (hash=35104124)
System.Windows.Data Warning: 107 : BindingExpression (hash=14200498):   At level 0 using cached accessor for AppViewModel.KundeVM: RuntimePropertyInfo(KundeVM)
System.Windows.Data Warning: 104 : BindingExpression (hash=14200498): Replace item at level 0 with AppViewModel (hash=35104124), using accessor RuntimePropertyInfo(KundeVM)
System.Windows.Data Warning: 101 : BindingExpression (hash=14200498): GetValue at level 0 from AppViewModel (hash=35104124) using RuntimePropertyInfo(KundeVM): KundeViewModel (hash=39638585)
System.Windows.Data Warning: 107 : BindingExpression (hash=14200498):   At level 1 using cached accessor for KundeViewModel.Skunde: RuntimePropertyInfo(Skunde)
System.Windows.Data Warning: 104 : BindingExpression (hash=14200498): Replace item at level 1 with KundeViewModel (hash=39638585), using accessor RuntimePropertyInfo(Skunde)
System.Windows.Data Warning: 101 : BindingExpression (hash=14200498): GetValue at level 1 from KundeViewModel (hash=39638585) using RuntimePropertyInfo(Skunde): <null>
System.Windows.Data Warning: 106 : BindingExpression (hash=14200498):   Item at level 2 is null - no accessor
System.Windows.Data Warning: 80 : BindingExpression (hash=14200498): TransferValue - got raw value {DependencyProperty.UnsetValue}
System.Windows.Data Warning: 88 : BindingExpression (hash=14200498): TransferValue - using fallback/default value ''
System.Windows.Data Warning: 89 : BindingExpression (hash=14200498): TransferValue - using final value ''
AppViewModel:

    class AppViewModel : ObservableObject
    {
        private object _currentView;
        public object CurrentView
        {
            get { return _currentView; }
            set { OnPropertyChanged(ref _currentView, value); }
        }

        private KundeViewModel _kundeVM;
        public KundeViewModel KundeVM
        {
            get { return _kundeVM; }
            set { OnPropertyChanged(ref _kundeVM, value); }
        }

        public AppViewModel()
        {
            KundeVM = new KundeViewModel();
            CurrentView = KundeVM;
        }



    }
}
昆德:

        private int _id;
        public int Id
        {
            get { return _id; }
            set { OnPropertyChanged(ref _id, value); }
        }

        private int _kunnr;
        public int Kunnr
        {
            get { return _kunnr; }
            set { OnPropertyChanged(ref _kunnr, value); }
        }

        private string _name;
        public string Name
        {
            get { return _name; }
            set { OnPropertyChanged(ref _name, value); }
        }

        private string _branche;
        public string Branche
        {
            get { return _branche; }
            set { OnPropertyChanged(ref _branche, value); }
        }

        private string _strasse;
        public string Strasse
        {
            get { return _strasse; }
            set { OnPropertyChanged(ref _strasse, value); }
        }

        private int _plz;
        public int Plz
        {
            get { return _plz; }
            set { OnPropertyChanged(ref _plz, value); }
        }

        private string _ort;
        public string Ort
        {
            get { return _ort; }
            set { OnPropertyChanged(ref _ort, value); }
        }
我是新来的,我尝试了很多东西,但都没用

我没有错误或警告

问题是它不起作用,因为我在单独的窗口中有textbox和datagrid。 两个窗口具有相同的DataContext。 如果我把它放在同一个窗口,一切都很好,但这不是我需要的

结构


感谢您的帮助

根据我的记忆和遇到的情况,您无法执行由三部分组成的绑定引用,例如将文本框设置为KundeVM.Skunde.Plz viewModel.secondaryObject.someProperty。要解决此问题,您应该在窗体级别或内部控件上更新DataContext

如果所有控件总是以某种方式绑定到KundeVM对象,那么在窗体/窗口级别,设置

DataContext = {Binding KundeVM}
然后,在表单/窗口的其他地方,您不需要KundeVM的附加上下文。从那一级到下一级的所有东西都将默认为…哦,那就是我的东西所在的地方。。。这样,您的文本绑定将下降到Skunde.Plz

现在,如果在KundeVM级别有多个对象/属性,您仍然可以通过向KundeVM声明文本框的数据上下文来调整文本框,然后文本将成为特定的底层源。这样,不管表单/窗口绑定的其余部分是什么,都不会弄糟。去掉其他不重要的东西

 <TextBox Text="{Binding KundeVM.Skunde.Plz}" />
将成为

 <TextBox DataContext={Binding KundeVM} Text="{Binding Skunde.Plz}" />
但如果你是在窗口级别

<Window x:Class="YourAppNamespace.YourClass" 
    DataContext="{Binding KundeVM}" 
    ... rest of window stuff ... >


    <DataGrid ItemsSource="{Binding Kunden}" IsReadOnly="True" 
        SelectedItem="{Binding Skunde, Mode=OneWayToSource}" AutoGenerateColumns="False" >
        <.. rest of data grid content .. >
    </DataGrid
           
     <TextBox Text="{Binding Skunde.Plz}" />

</Window>

请注意第二个示例,在窗口级别的数据上下文中,您从KundeVM开始,因此窗口中的所有其他内容都是从该点开始的子属性/对象。这有助于解决您的问题吗?

我制作了一个示例源代码,它运行良好。 你能试试这个吗?完整的来源是在

结构 AppViewModel 公共类AppViewModel:ObserveObject { 私有对象_currentView; 公共对象当前视图 { 获取{return\u currentView;} 设置{u currentView=value;OnPropertyChanged;} } 私人KundeViewModel_kundeVM; 公共KundeViewModel KundeVM { 获取{return\u kundeVM;} 设置{u kundeVM=value;OnPropertyChanged;} } 公共AppViewModel { KundeVM=新的KundeViewModel; CurrentView=KundeVM; } } 昆德维尔模型 当KundeViewModel加载时,我填充了Kunden

公共类KundeViewModel:ObservieObject { 私人Kunde_skunde; 公共昆德斯肯德酒店 { 获取{return\u skunde;} 设置{u skunde=value;OnPropertyChanged;} } 私人可观测收集(kunden);; 公共可观测收集昆登 { 获取{return\u kunden;} 设置{u kunden=value;OnPropertyChanged;} } 公共设备模型 { 昆登=格昆登; } 私人可观测集合GetKunden { ObservableCollection源=新的ObservableCollection { 新昆德{Plz=0}, 新昆德{Plz=1}, 新昆德{Plz=2}, 新昆德{Plz=3}, 新昆德{Plz=4} }; 返回源; } } AppView.xaml AppView.xaml.cs 公共部分类AppView:UserControl { 公共应用程序视图 { 初始化组件; DataContext=新的AppViewModel; } } 后果 选择网格项时 当更改TextBox的值时
有些东西似乎是空的。我要尝试的第一件事是:绑定到KundeVM,第二个文本框绑定到KundeVM.Kunden。可能每个都有一个回退值。它们都显示一个对象吗?我不能绑定到KundeVM.Kunden,因为Kunden是一个可观察的集合。不,他们什么也不展示。至少应该展示有一个收藏。同样奇怪的是:为什么必须指定KundeVM。VM应该是Bindungs的默认数据上下文。还是一个子虚拟机?我编辑了我的问题。My DataContext被设置为AppViewModel它可以是,Skunde为null。没有足够的代码来查看问题什么是KundeVM?Skunde是如何被设置的?昆登,昆登在哪里?。因此,请阅读,特别是关于如何创建一个最小的、完整的、可验证的示例。感谢您的回答。我试过了,但还是不行。@sh2727,下一步我会试试。注释掉失败的Plz列。同时展示你的Kunde类的结构。这一特定领域有什么缺失吗?请用其他信息编辑您的原始帖子。继续删除列,直到数据允许显示,然后逐渐添加,直到再次失败。我也有
与此类似,可能只是文本框Plz没有默认为空字符串值,并且为null?它没有失败。xaml将Plz识别为int,将其他字段识别为其数据类型。但是绑定不起作用。如果我在文本框中写入内容,Plz中的值不会改变。如果我在网格中选择某个内容,Plz会更改值,但文本框不会加载Plz。我在单独的窗口中有文本框和网格,我希望有类似匹配代码的内容。这就是为什么我需要它在一个单独的窗口。当我把文本框和Gridview放在同一个窗口中时,一切正常。但如果我把它放在另一个窗口,它就不工作了。两个窗口都有相同的DatacontextI误解并更新了Datagrid和TextBox分为不同窗口的代码,请重试。感谢您的样品帮助我找到了解决方案
DataContext = {Binding KundeVM}
 <TextBox Text="{Binding KundeVM.Skunde.Plz}" />
 <TextBox DataContext={Binding KundeVM} Text="{Binding Skunde.Plz}" />
<Window x:Class="YourAppNamespace.YourClass" 
    DataContext="{Binding KundeVM}" 
    ... rest of window stuff ... >


    <DataGrid ItemsSource="{Binding Kunden}" IsReadOnly="True" 
        SelectedItem="{Binding Skunde, Mode=OneWayToSource}" AutoGenerateColumns="False" >
        <.. rest of data grid content .. >
    </DataGrid
           
     <TextBox Text="{Binding Skunde.Plz}" />

</Window>