绑定表达路径误差 - 尝试将文本框绑定到视图模型时



我不断收到以下错误消息:

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; }
}

您将TextBoxDataContext绑定到类,这没有任何意义 - 您需要绑定到类的特定实例。

此外,您将TextBox.Text绑定到TabToAdd;看起来应该是 TabsToAdd-属性的实际名称(注意缺少 s )。

如果您查看此消息:

system.windows.data错误:40:bindingExpression路径错误:'tabbableViewModel''object'''tabbableViewModel'''object''manageTabsViewModel'。

...很明显,您已经有一个ManageTabsViewModel作为DataContext。这意味着您可以访问ManageTabsViewModel的属性,如果有意义。ManageTabsViewModel最接近TabbableViewModelIEnumerable TabbableItems,意思是

TabbableItems[0]

可能有意义。

您试图绑定到TextBox.TextTabsToAdd属性也是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

,由于代码不完整,很难看到您的目标 - 如果您可以将其简化为问题的最简单示例,那么建议更容易。

最新更新