ListView选择的项目绑定不起作用

时间:2016-07-27 12:06:39

标签: xaml listview mvvm selecteditem

我在uwp中有一个listview,以及一个声明pataient_List和selected_pa​​tient的视图模型。我的listview显示itemsource但我不知道为什么我的listview不显示所选项目。

 <ListView   ItemsSource="{Binding pataient_List}"
             SelectedItem="{Binding selected_patient, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock  Text="{Binding name_to_show_menu, Mode=TwoWay}" />
                            </StackPanel>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>

viewmodel是

public class patient_view_model : notify_property_changed_base
    {
        public patient_view_model(patient  patient_param)
        {
            pataient_List = new ObservableCollection<patient>();
            load_patient(); // this function put patients in pataient_List
            selected_patient = patient_param;
        }

 public patient selected_patient
        {
            get { return _selected_patient; }
            set
            {
                if (_selected_patient != value)
                {
                    _selected_patient = value;
                    RasiePropertyChanged();
                }
            }
        }
public ObservableCollection<patient> pataient_List { set; get; }

3 个答案:

答案 0 :(得分:1)

一个原因可能是所选项目必须是pataient_List

中的一个对象

另一个原因可能是因为您在视图模型的构造函数中设置selected_patient,这肯定是在您将视图模型绑定到视图之前。因此,在将视图模型绑定到视图之后,为什么不尝试设置selected_patient

答案 1 :(得分:1)

忘记ListView中的ItemTemplate。

 <ListView   ItemsSource="{Binding pataient_List}" 
    SelectedItem="{Binding selected_patient, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Foreground="Black">            
</ListView>

.NET没有关于如何显示数据的线索,因此它只是在每个对象上调用ToString()方法并使用它来表示项目。覆盖患者对象中的ToString()方法以显示您需要的内容。这是代码:

public class patient
    {
        public string name_to_show_menu;
        public override string ToString()
        {
            return this.name_to_show_menu;
        }
    }

答案 2 :(得分:0)

我用这个答案来解决问题。

public override bool Equals(object obj) 
 { 
 if (this.name_to_show_menu == (obj as patient).name_to_show_menu) 
    return true; 
 else  
    return false; 
 }