我不断收到以下错误消息:
system.windows.data错误:40:绑定表达路径错误: " tabtoadd"属性在"对象"上找不到" managetabviewModel";目标 属性是"文本"(类型为"字符串")。
system.windows.data错误:40:绑定表达路径错误: "对象"上找不到的" tabbableViewModel"属性 " ManagetabsViewModel"。
bindingExpression:path = tabbableViewModel; dataitem ='ManageTabViewModel'; 目标元素是'textbox'(name ='');目标属性是 'DataContext'(键入'对象')。
每当我试图将文本框绑定到视图模型时,就会发生这种情况。到目前为止,这是我的代码:
MANAKETABSVIEWMODEL.XAML
<TextBox DataContext="{Binding TabbableViewModel}" Text="{Binding Path=TabsToAdd}" Width="250" HorizontalAlignment="Left" Margin="6,0,0,6"></TextBox>
MANAKETABSVIEWMODEL.CS
public class TabbableViewModel: ITabbableViewModel, INotifyPropertyChanged
{
public ITabbable Tabbable {get; set};
public IEnumerable<ITabViewModel> Tabs { get; set }
private IEnumerable<string> _tabsToAdd;
public IEnumerable<string> TabsToAdd
{
get { return _tabsToAdd }
set
{
if(Equals(value, _tabsToAdd))
return;
_tabsToAdd = value
OnPropertyChanged("TabsToAdd");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public interface ITabbable
{
IEnumerable<string> TabsToAdd { get; set; }
}
public interface ITabbableViewModel
{
ITabbable Tabbable { get; set; }
}
public class ManageTabsViewModel : IManageTabsViewModel
{
public void SetTabbable(IEnumerable<ITabbable> tabbable)
{
TabbableItems = tabbable;
ExpandedTabbableItems = (from t in TabbableItems
from u in t.Tabs.DefaultIfEmpty()
select new TabbableViewModel()
{
Tabbable = t,
Tabs = t.Tabs,
TabsToAdd = t.TabsToAdd
}).ToArray();
}
public IEnumerable<ITabbableViewModel> ExpandedTabbableItems { get; set; }
public IEnumerable<ITabbable> TabbableItems { get; set; }
}
public interface IManageTabsViewModel
{
void SetTabbable(IEnumerable<ITabbable> tabbable);
IEnumerable<ITabbable> TabbableItems { get; }
IEnumerable<ITabbableViewModel> ExpandedTabbableItems { get; }
}
您将TextBox
的DataContext
绑定到类,这没有任何意义 - 您需要绑定到类的特定实例。
此外,您将TextBox.Text
绑定到TabToAdd
;看起来应该是 TabsToAdd
-属性的实际名称(注意缺少 s )。
如果您查看此消息:
system.windows.data错误:40:bindingExpression路径错误:'tabbableViewModel''object'''tabbableViewModel'''object''manageTabsViewModel'。
...很明显,您已经有一个ManageTabsViewModel
作为DataContext
。这意味着您可以访问ManageTabsViewModel
的属性,如果有意义。ManageTabsViewModel
最接近TabbableViewModel
是IEnumerable
TabbableItems
,意思是
TabbableItems[0]
可能有意义。
您试图绑定到TextBox.Text
的TabsToAdd
属性也是IEnumerable
,所以我不正确地知道您期望在文本框中显示什么 - 这可能是由类名称IEnumerable.ToString
。(但是,您可以将其更改为通过转换器进行逗号分隔的字符串列表。)或者您可以绑定到TabsToAdd[0]
以获取第一个(或者,如果列表为空,则是错误)。
TextBox
从其父母那里继承了其DataContext
。但是,您可以将其设置为代码范围的任何内容。在XAML中给它一个名字:
<TextBox
x:Name="textBox"
Text="{Binding Path=TabsToAdd}"
Width="250"
HorizontalAlignment="Left"
Margin="6,0,0,6" />
在代码构建器中,分配DataContext:
textBox.DataContext = ... // Some object whose properties you'll bind to
,由于代码不完整,很难看到您的目标 - 如果您可以将其简化为问题的最简单示例,那么建议更容易。