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