簡體   English   中英

MVVM WPF數據綁定問題

[英]MVVM WPF Data Binding issue

我是MVVM和WPF的新手,我有以下模型,希望通過數據綁定向用戶展示(下面也提供了viewmodel和xaml的代碼)。 但是我不確定缺少什么,因為用戶列表根本沒有顯示在UI上。 誰能告訴我代碼中我缺少哪一個?

如果不是用戶類,則使用用戶類中的列表:

  private List<User> _UsersList;
        public List<User> users
        {
            get { return _UsersList; }
            set { _UsersList = value; }
        }

,則出價有效!!但如果使用Users類,則綁定無效!

模型:

 public class User : ObservableObject
 {

        public int ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public bool IsPremiumUser { get; set; }
        public string selectedItem { get; set; }
        public string SelectedValue
        {
            get { return selectedItem; }
            set
            {
                selectedItem = value;
                //  suser.age = Convert.ToInt32(value);
                RaisePropertyChangedEvent("SelectedValue");
            }

        }
        public int[] myItem { get; set; }
        public int[] UserItems
        {
            get { return myItem; }
            set { myItem = value; }
        }
        private SelectedUser suser = new SelectedUser();
        public int selected { get; set; }
        public int Selected
        {
            get { return selected; }
            set
            {
                selected = value;
                suser.age = Convert.ToInt32(value);
                RaisePropertyChangedEvent("Selected");
            }

        }
    }
   public class Users : ObservableObject
    {
        private List<User> mylist = new List<User>();
        private List<User> list
        {
            get { return mylist; }
            set
            {
                mylist = value;

            }
        }
        public void Add(User user)
        {
            this.list.Add(user);
        }

        public User GetById(int id)
        {
            return this.list.First(u => u.ID == id);
        }

    }

ViewModel:

 public class ViewModel : ObservableObject
 {

        public ViewModel()
        {
            users = new Users();
            for (int i = 0; i < 100000; ++i)
            {
                int[] numbers;
                numbers = new int[3] { 1, 2, 3 };
                var user = new User { ID = i, Name = "Name " + i.ToString(), Age = 20 + i, UserItems = numbers, SelectedValue = "0" };
                if (i == 2 || i == 4)
                {
                    user.IsPremiumUser = true;
                }
                users.Add(user);
            }

        }
        private Users _UsersList;
        public Users users
        {
            get { return _UsersList; }
            set { _UsersList = value; }
        }

        private int _currenuser;
        public int CurrentUser
        {
            get
            {
                return _currenuser;
            }
            set
            {
                _currenuser = value;

                RaisePropertyChangedEvent("CurrentUser");
            }
        }
    }

XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        Icon="C:\Users\maninx2\Documents\Visual Studio 2013\Projects\SampleFormMaker1\WpfApplication1\abbott_point_of_care_HuT_icon.ico"
        Title="MainWindow" Height="700" Width="1249.129">
    <Window.Resources>
        <DataTemplate x:Key="NormalUserDataTemplate">
            <StackPanel>
                <TextBlock Text="{Binding Name}" />
                <TextBox Text="{Binding SelectedValue, UpdateSourceTrigger=PropertyChanged}" Width="300" />

            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="PremiumUserDataTemplate">
            <StackPanel Background="LightBlue">
                <ComboBox  SelectedIndex="{Binding SelectedValue, UpdateSourceTrigger=PropertyChanged}" Text="{Binding Name}"  Width="300" ItemsSource="{Binding UserItems}"/>

            </StackPanel>
        </DataTemplate>
        <local:PremiumUserDataTemplateSelector x:Key="myPremiumUserDataTemplateSelector" />
    </Window.Resources>
    <TabControl Name="TabControl1">
        <TabControl.ItemContainerStyle>
            <Style TargetType="{x:Type TabItem}">
                <Setter Property="Visibility" Value="Collapsed"/>
            </Style>
        </TabControl.ItemContainerStyle>
        <TabItem Header="General">
            <ScrollViewer VerticalScrollBarVisibility="Auto">
                <StackPanel Height="800" Orientation="Horizontal" >
                    <ListView x:Name="myListView" ItemsSource="{Binding users,  Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ItemTemplateSelector="{StaticResource myPremiumUserDataTemplateSelector}" SelectedIndex="{Binding CurrentUser, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                    </ListView>
                    <ListView x:Name="myListView1" ItemsSource="{Binding users,  Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"   HorizontalAlignment="Stretch" >
                        <ListView.View>
                            <GridView>
                                <GridViewColumn Width="140" Header="Selected Values"
                 DisplayMemberBinding="{Binding SelectedValue}"  />

                            </GridView>
                        </ListView.View>
                    </ListView>
                    <Button Content="Next"
        HorizontalAlignment="Left"
        Margin="10,10,0,0"
        VerticalAlignment="Top"
        Width="75"
        Click="Button_Click"/>
                </StackPanel>

            </ScrollViewer>

        </TabItem>
        <TabItem Header="Second Tab">
            <StackPanel>
                <TextBlock Name="lbl1" Text="{Binding CurrentUser, UpdateSourceTrigger=PropertyChanged}"/>

            <Button Content="Previous"
        HorizontalAlignment="Left"
        Margin="10,10,0,0"
        VerticalAlignment="Top"
        Width="75"
        Click="Button_Click1"/>
            </StackPanel>
        </TabItem>

    </TabControl>

</Window>

您缺少從ObservableCollection繼承用戶的信息。 因此,WPF引擎不知道如何從此類中獲取數據。

更新:

@ user3033921:您從ObservableObject繼承了它,而不是ObservableCollection。 因此,事情是,如果您希望將該類從列表中識別出來,則必須讓該類被ICollection對象繼承,並且如果您希望該類是可觀察的,則應同時實現ICollection和INotifyPropertyChange。 因此,@ BradleyDotNet的觀點是,如果您沒有創建自己的類型的特定原因,則只需創建一個ObservableCollection類型的用戶對象即可。 如果您特別需要具有用戶類型,則可以從ObserableCollection派生它作為推薦的解決方案。 但是請記住,您現在不想再在Users類中使用List,因為您的類現在本身就是一個列表。 因此,如果您有任何特定的實現(例如GetByID),則該類將如下所示:

public class Users :ObservableCollection<User>
{
    public User GetById(int id)
    {
        return this.First(u => u.ID == id);
    }

}

暫無
暫無

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

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