簡體   English   中英

ItemsSource到TreeView的SelectedItem屬性

[英]ItemsSource to property of SelectedItem of TreeView

我正在創建我的第一個WPF應用程序(之前已經使用WinForms完成了一些操作),並且我開始喜歡它(即使它有時增加了不必要的復雜性。)。 但是我遇到了一個我無法真正解決的問題。

問題:我有一個TreeView和一個伴隨的GroupBox,具有選定(第二級)項目的屬性。 這些屬性在TextBoxes中可編輯(綁定到SelectedItem。[Property]),並且可以正常工作。 但是屬性之一是一個列表(定義為ObservableCollection),我想在ComboBox中顯示它,因此我將ItemsSource綁定到TreeView的SelectedItem.Modes:

<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 + ")";
    }
}

您需要將efcFixtureModel.Modes從Field轉換為Property:

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}" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM