使用绑定MVVM的属性填充文本框

时间:2017-09-23 19:57:37

标签: wpf data-binding

我试图弄清楚MVVM是如何工作的,并希望从简单开始。

我制作了一个模型,一个视图和一个ViewModel。我将视图连接到一个窗口。这或多或少都有效。 在视图中我有一个文本框,我想填写属性的值。文本框保持空白!?

这就是我所拥有的: 型号:

namespace Qbox_0001.Model
{
    public class RegistratieModel
    {
    }

    public class Registratie : INotifyPropertyChanged
    {

        //Fields
        private string programmaNaam;

        //eventhandler die kijkt of een property wijzigt
        public event PropertyChangedEventHandler PropertyChanged;

        private void RaisePropertyChanged(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }

        //Properies
        public string ProgrammaNaam
        {
            get { return programmaNaam; }
            set
            {
                if (programmaNaam != value)
                {
                    programmaNaam = value;
                    RaisePropertyChanged("ProgrammaNaam");
                }
            }
        }

    }
}

观点:

<UserControl x:Name="UserControlRegistratie" x:Class="Qbox_0001.Views.RegistratieView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Qbox_0001.Views"
             mc:Ignorable="d" Height="1000" Width="860" MaxWidth="860" HorizontalContentAlignment="Left" VerticalContentAlignment="Top">
    <Grid x:Name="GridRegistratie">


        <Grid.RowDefinitions>
            <RowDefinition x:Name="RowDef_Menu" Height="21*" MaxHeight="21" MinHeight="21"/>
            <RowDefinition x:Name="RowDef_TabControl" Height="500*" MinHeight="500"/>
            <RowDefinition x:Name="Rowdef_Bottom" Height="40*" MaxHeight="40" MinHeight="40"/>
        </Grid.RowDefinitions>

        <Grid x:Name="Grid_Registratie_WorkArea" Grid.Row="1">

            <TabControl x:Name="TabControl_Registratie">
                <TabItem Header="Registratie">
                    <Grid x:Name="Grid_Tab_Registratie">
                        <Border>
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition x:Name="GridRowDef_Algemeen" MinHeight="68" Height="68*" MaxHeight="68"/>
                                    <RowDefinition x:Name="GridRowDef_Locatie"  MinHeight="120" Height="120*" MaxHeight="120"/>
                                    <RowDefinition x:Name="GridRowDef_AantalDagen" MinHeight="105" Height="105*" MaxHeight="105"/>
                                    <RowDefinition x:Name="GridRowDef_MaxDagen" MinHeight="105" Height="105*" MaxHeight="105"/>
                                    <RowDefinition x:Name="GridRowDef_Lokaal" MinHeight="100" Height="100*" MaxHeight="100"/>
                                    <RowDefinition x:Name="GridRowDef_LicBestand" Height="150*" MaxHeight="150" MinHeight="150"/>
                                </Grid.RowDefinitions>

                                <GroupBox x:Name="GroupBox_algemeen" Header="Algemeen" Margin="10,4,10,3">
                                    <Grid>
                                        <Label x:Name="Label_Klant" Content="Klant:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Padding="0,5,5,5"/>
                                        <Label x:Name="Label_Programma" Content="Programma:" HorizontalAlignment="Left" Margin="356,10,0,0" VerticalAlignment="Top"/>
                                        <Label x:Name="Label_Versie" Content="Versie:" HorizontalAlignment="Left" Margin="645,10,0,0" VerticalAlignment="Top"/>
                                        <TextBox x:Name="textBox_KlantNaam" HorizontalAlignment="Left" Height="23" Margin="49,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="288"/>

                                        <!-- the textbox keeps empty -->
                                        <TextBox x:Name="TextBox_ProgrammaNaam" Text="{Binding ElementName=RegistratieViewModel, Path=ProgrammaNaam, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="23" Margin="431,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="190" IsEnabled="False" />


                                        <TextBox x:Name="TextBox_Versie" HorizontalAlignment="Left" Height="23" Margin="695,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" IsEnabled="False" />

                                    </Grid>
                                </GroupBox>

                            </Grid>
                        </Border>
                    </Grid>
                </TabItem>
                <TabItem Header="Licentie(s)">
                    <Grid x:Name="Grid_Tab_Licentie" Background="#FFE5E5E5"/>
                </TabItem>
            </TabControl>
        </Grid>

    </Grid>
</UserControl>

在View.cs中:

namespace Qbox_0001.Views
{
    /// <summary>
    /// Interaction logic for RegistratieView.xaml
    /// </summary>
    public partial class RegistratieView : UserControl
    {
        public RegistratieView()
        {
            InitializeComponent();
            this.DataContext = new Qbox_0001.ViewModel.RegistratieViewModel();
        }
    }
}

ViewModel

using Qbox_0001.Model;                  //
using System.Collections.ObjectModel;   //


namespace Qbox_0001.ViewModel
{
    public class RegistratieViewModel
    {
        public RegistratieViewModel()
        {
            loadRegistratieOnderdelen();
        }

        public ObservableCollection<Registratie> RegistratieOnderdelen  //Registratie = "public class Registratie : INotifyPropertyChanged" van de Model
        {
            get;
            set;
        }

        public void loadRegistratieOnderdelen()
        {
            ObservableCollection<Registratie> regOnderdelen = new ObservableCollection<Registratie>();

            regOnderdelen.Add(new Registratie { ProgrammaNaam = "Test" });

        }
    }
}

2 个答案:

答案 0 :(得分:0)

我可以看到您的代码存在一些问题。

您正在使用数据填充本地ObservableCollection(在loadRegistratieOnderdelen()方法内),但由于它是本地的,因此它不是DataContext的成员,因此对View不可用。您必须使用已在RegistratieViewModel中声明的 RegistratieOnderdelen 等公共属性。

接下来,您正在使用ObservableCollection,而您可能只想使用String类型的属性。当您想要表示列表时使用集合,例如在ListView或ItemsControl中。您的视图表明您要绑定单个文本值,因此String类型的公共属性更有意义。

Best,Nico

答案 1 :(得分:0)

DataContextRegistratieViewModel。此类具有RegistratieOnderdelen属性,该属性返回Registratie个对象的集合。

您可以绑定到一个此类项目的ProgrammaNaam属性,但您需要指定要绑定的项目,例如第一个:

<TextBox x:Name="TextBox_ProgrammaNaam" Text="{Binding Path=RegistratieOnderdelen[0].ProgrammaNaam, UpdateSourceTrigger=PropertyChanged}" ... />