簡體   English   中英

在WPF中使用ListView和擴展器時,綁定不起作用

[英]Binding not working when using listview with an expander in WPF

首先,我是新手,剛剛開始學習WPF。

我有一個雇員班級,如下所示:

public class Employee : INotifyPropertyChanged
    {
        public Employee()
        {
            _subEmployee = new ObservableCollection<Employee>();
        }

        private string _name;

        public ObservableCollection<Employee> SubEmployee
        {
            get { return _subEmployee; }
            set
            {
                _subEmployee = value;
                NotifiyPropertyChanged("SubEmployee");
            }
        }

        public string Name
        {
            get { return _name; }
            set
            {
                _name = value; 
                NotifiyPropertyChanged("Name");
            }
        }

        ObservableCollection<Employee> _subEmployee;

        public event PropertyChangedEventHandler PropertyChanged;
        void NotifiyPropertyChanged(string property)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

我在MainWindow類中創建了一個可觀察的雇員集合,並將datacontext設置為相同的集合,如下所示:

public partial class MainWindow : Window
    {
        public ObservableCollection<Employee> Emp { get; private set; }

        public MainWindow()
        {
            InitializeComponent();
            Emp = new ObservableCollection<Employee>();
            Emp.Add(new Employee(){Name = "Anuj"});
            Emp.Add(new Employee() { Name = "Deepak" });
            Emp.Add(new Employee() { Name = "Aarti" });

            Emp[0].SubEmployee.Add(new Employee(){Name = "Tonu"});
            Emp[0].SubEmployee.Add(new Employee() { Name = "Monu" });
            Emp[0].SubEmployee.Add(new Employee() { Name = "Sonu" });

            Emp[2].SubEmployee.Add(new Employee() { Name = "Harsh" });
            Emp[2].SubEmployee.Add(new Employee() { Name = "Rahul" });
            Emp[2].SubEmployee.Add(new Employee() { Name = "Sachin" });
            this.DataContext = Emp;
        }
    }

現在,在xaml.cs中,我編寫了以下代碼:

<Grid>
        <ListView ItemsSource="{Binding Emp}">
            <ListView.ItemTemplate>
                <DataTemplate DataType="{x:Type vm:Employee }">
                    <Expander Header="{Binding Name}">
                        <ListView ItemsSource="{Binding SubEmployee}">
                            <ListView.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text ="{Binding Name}"/>
                                </DataTemplate>
                            </ListView.ItemTemplate>
                        </ListView>
                    </Expander>
                </DataTemplate>
            </ListView.ItemTemplate> >
        </ListView>
    </Grid>

現在,我應該使用擴展器按鈕來獲取Employee對象的集合,單擊該按鈕應該給我所有的SubEmployee。 但是不幸的是我沒有得到預期的結果。

請幫助我解決綁定問題。

您的DataContextObservableCollection<Employee>因此外部LitView應該將ItemsSource直接綁定到當前DataContext 換句話說,您的DataContext沒有Emp屬性。 您的上下文是Emp屬性

<ListView ItemsSource="{Binding}">
    <ListView.ItemTemplate>
        <!-- .... -->
    </ListView.ItemTemplate>
</ListView>

或保留XAML不變,並更改了將DataContext設置為

this.DataContext = this;

編輯

以為這是復制/粘貼錯誤,但是由於您抱怨無效的操作異常錯誤,這是因為ItemTemplate標記末尾的第二個>

</ListView.ItemTemplate> >

我已經測試過您的代碼。 DataContext設置不正確。 我還給文本加了顏色。 嘗試這個。 在我的末端完美工作!

XAML:

<Grid>
    <ListView ItemsSource="{Binding Emp}">
        <ListView.ItemTemplate>
            <DataTemplate DataType="{x:Type vm:Employee }">
                <Expander Header="{Binding Name}">
                    <ListView ItemsSource="{Binding SubEmployee}">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Foreground="Black" Text  ="{Binding Name}"/>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </Expander>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

背后的代碼:

public partial class MainWindow : Window
{
    public ObservableCollection<Employee> Emp { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;

        Emp = new ObservableCollection<Employee>();
        Emp.Add(new Employee() { Name = "Anuj" });
        Emp.Add(new Employee() { Name = "Deepak" });
        Emp.Add(new Employee() { Name = "Aarti" });

        Emp[0].SubEmployee.Add(new Employee() { Name = "Tonu" });
        Emp[0].SubEmployee.Add(new Employee() { Name = "Monu" });
        Emp[0].SubEmployee.Add(new Employee() { Name = "Sonu" });

        Emp[2].SubEmployee.Add(new Employee() { Name = "Harsh" });
        Emp[2].SubEmployee.Add(new Employee() { Name = "Rahul" });
        Emp[2].SubEmployee.Add(new Employee() { Name = "Sachin" });

    }
}

其他數據類保持不變!

暫無
暫無

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

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