【问题标题】:BindingExpression path error - when trying to bind the textbox to the view modelBindingExpression 路径错误 - 尝试将文本框绑定到视图模型时
【发布时间】:2016-11-28 23:18:43
【问题描述】:

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

System.Windows.Data 错误:40:BindingExpression 路径错误: 在“对象”“ManageTabViewModel”上找不到“TabToAdd”属性;目标 属性是“文本”(类型“字符串”)。

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

BindingExpression:Path=TabbableViewModel;DataItem='ManageTabViewModel'; 目标元素是'TextBox'(名称='');目标属性是 “DataContext”(类型“对象”)。

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

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

【问题讨论】:

    标签: c#


    【解决方案1】:

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

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

    如果您查看此消息:

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

    ...很明显,您已经有一个ManageTabsViewModel 作为您的DataContext。这意味着您可以访问ManageTabsViewModel 的属性,如果这有意义的话。 ManageTabsViewModelTabbableViewModel 最接近的是 IEnumerable 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
    

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

    【讨论】:

    • 嗨,Petter 感谢您回复我。我已经更新了代码中的错字。我不明白您将 TextBox 绑定到类的特定实例是什么意思,您能否给我看一个代码示例来说明您的意思?我已经为这个问题苦苦挣扎了一个星期。
    • 这是否意味着我必须将 IEnumerable&lt;string&gt; TabsToAdd 从 TabbableViewModel 移动到 ManageTabsViewModel?
    • 我扩展了我的答案。我不完全了解您的数据结构或您希望实现的目标,所以我不能说您是否需要移动任何东西。你这里有相当多的接口和类...
    猜你喜欢
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2017-02-14
    • 2021-02-13
    • 2022-01-18
    相关资源
    最近更新 更多