BindingExpression路径错误 - 尝试将文本框绑定到视图模型时

时间:2016-11-28 23:18:44

标签: c#

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

  

System.Windows.Data错误:40:BindingExpression路径错误:   'object'“ManageTabViewModel”上找不到'TabToAdd'属性;目标   property是'Text'(类型'String')。

     

System.Windows.Data错误:40:BindingExpression路径错误:   'object'上找不到'TabbableViewModel'属性   “ManageTabsViewModel”。

     

BindingExpression:路径= TabbableViewModel;的DataItem = 'ManageTabViewModel';   target元素是'TextBox'(Name ='');目标属性是   'DataContext'(输入'Object')。

每当我尝试将文本框绑定到视图模型时,就会发生这种情况。到目前为止,这是我的代码:

ManageTabsViewModel.xaml

<TextBox DataContext="{Binding TabbableViewModel}" Text="{Binding Path=TabsToAdd}" Width="250" HorizontalAlignment="Left" Margin="6,0,0,6"></TextBox>

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

1 个答案:

答案 0 :(得分:1)

您将DataContext的{​​{1}}绑定到一个没有任何意义的类 - 您需要绑定到该类的特定实例。< / p>

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

如果你看一下这条消息:

  

System.Windows.Data错误:40:BindingExpression路径错误:&#39; TabbableViewModel&#39;在&#39; object&#39;上找不到的属性&#34; ManageTabsViewModel&#34;

...很明显,您已经TabsToAdd作为ManageTabsViewModel了。这意味着如果有意义,您可以访问DataContext的属性。 ManageTabsViewModelManageTabsViewModel最接近的是TabbableViewModel IEnumerable,意思是

TabbableItems

可能有意义。

您尝试绑定到TabbableItems[0] 的{​​{1}}媒体资源也是TabsToAdd,因此我无法正确了解您希望展示的内容在文本框中 - 它可能是由TextBox.Text生成的类名。 (但是,您可以通过转换器将此更改为逗号分隔的字符串列表。)或者您可以绑定到IEnumerable以获取第一个(或者,如果列表为空,则出现错误)

IEnumerable.ToString从其父级继承其TabsToAdd[0]。但是,您可以将其设置为代码隐藏的任何内容。在XAML中为它命名:

TextBox

在代码隐藏构造函数中,分配DataContext:

DataContext

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