ItemsSource到TreeView的SelectedItem的属性

本文关键字:SelectedItem 属性 TreeView ItemsSource | 更新日期: 2023-09-27 18:19:01

我正在创建我的第一个WPF应用程序(之前用WinForms做过一些),我开始喜欢它(即使它有时会增加不必要的复杂性…)。但是我遇到了一个问题,我不能真正弄清楚。

问题:我有一个TreeView和一个伴侣GroupBox与所选(第二级)项目的属性。属性是可编辑的文本框(绑定到SelectedItem.[Property]),这工作得很好。但是其中一个属性是一个列表(定义为ObservableCollection),我想在ComboBox中显示它,所以我将ItemsSource绑定到SelectedItem。TreeView模式:

<ComboBox Name="FixtureModesListBox" ItemsSource="{Binding ElementName=FixturesTreeView, Path=SelectedItem.Modes}" ItemTemplate="{StaticResource FixtureModeTemplate}" />

显然,这不起作用,我得到的错误说:

 BindingExpression path error: 'Modes' property not found on 'object' ''efcFixtureModel' ...

属性存在、已设置、已公开等

我当前的解决方案我可以让它工作,通过使用一些代码隐藏(并引用完全相同的"路径"):

    private void FixturesTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        if (FixturesTreeView.SelectedItem is efcFixtureModel) // The 1st level/parent items is of a different type
        {
            FixtureModesListBox.ItemsSource = (FixturesTreeView.SelectedItem as efcFixtureModel).Modes;
        }
    }

我不明白为什么这不起作用,我也没有在网上找到任何好的信息。

编辑以包含更多信息:

<TreeView Name="FixturesTreeView" ItemTemplate="{StaticResource FixtureItemTemplate}" SelectedItemChanged="FixturesTreeView_SelectedItemChanged">
</TreeView>
...
        // Assignment of ItemsSource
        FixturesTreeView.ItemsSource = mainWin.Companies;
...
public partial class efcMainWindow : Window
{
    // Definition of Companies
    public ObservableCollection<efcCompany> Companies;
...
// Definition of efcCompany    
public class efcCompany
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Url { get; set; }
    public string Logo { get; set; }
    public int FixtureCount { get { return Fixtures.Count; } }
    public ObservableCollection<efcFixtureModel> Fixtures { get; set; }
    public efcCompany(string name = "", int id = -1, string url = "", string logo = "")
    {
        this.Name = name;
        this.Id = id;
        this.Url = url;
        this.Logo = logo;
        this.Fixtures = new ObservableCollection<efcFixtureModel>();
    }
    public override string ToString()
    {
        return "#" + Id.ToString() + ": " + Name + " (" + Url + ", " + Logo + ")";
    }
}
// Definition of efcFixtureController
public class efcFixtureModel
{
    public int Id { get; set; }
    public int Manufacturer { get; set; }
    public efcFixtureType Type { get; set; }
    public string Name { get; set; }
    public string Image { get; set; }
    public string Description { get; set; }
    public byte TotalChannelCount { get; set; }
    public ObservableCollection<efcFixtureMode> Modes;
    public efcFixtureModel()
    {
        Modes = new ObservableCollection<efcFixtureMode>();
    }
    public override string ToString()
    {
        return "#" + Id.ToString() + ": " + Name + " (" + Type.ToString() + ", " + Image + ", " + Description + ")";
    }
}

ItemsSource到TreeView的SelectedItem的属性

你需要转换你的effcfixturemodel。从字段到属性的模式:

public ObservableCollection<efcFixtureMode> Modes { get; set; }

请阅读c#中属性和变量的区别

正如我之前所说,你需要从FixturesTreeView中绑定SelectedItem到ViewModel中efcFixtureModel类型的属性。

<TreeView Name="FixturesTreeView" ItemTemplate="{StaticResource FixtureItemTemplate}" SelectedItemChanged="FixturesTreeView_SelectedItemChanged"
SelectedItem="{Binding TreeViewSelectedItem}">
</TreeView>
<ComboBox Name="FixtureModesListBox" ItemsSource="{Binding TreeViewSelectedItem.Modes}" ItemTemplate="{StaticResource FixtureModeTemplate}" />