在ViewModel中获取TextBox值

时间:2016-09-07 16:26:05

标签: wpf xaml mvvm

任何人请告诉我示例,如何在View Model中获取文本框值,我的模型属性已经与文本框以模式双向绑定

enter image description here

这是我的视图模型函数,我想在我的可观察集合中添加新记录。

C#

public void AddPerson()
{
  // add new record
}

private Model.Person _PersonData;
public Model.Person PersonData
{
    get {
        if(_PersonData==null)
        {
            _PersonData = new Person();
        }
        return _PersonData;
        }
    set
    {
        Setproperty(ref this._PersonData, value);
    }
}

XAML

<Controls:MetroWindow
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
    xmlns:VM="clr-namespace:Demo.ViewModel"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:Model="clr-namespace:Demo.Model" mc:Ignorable="d" x:Class="Demo.MainWindow"
    Title="MainWindow" Height="438" Width="664"
    GlowBrush="{DynamicResource AccentColorBrush}"              
    WindowStartupLocation="CenterScreen">
<Controls:MetroWindow.Resources>
    <Model:Person x:Key="PersonDataSource" d:IsDataSource="True"/>
    <VM:MainViewModel x:Key="MainViewModelDataSource" d:IsDataSource="True"/>
</Controls:MetroWindow.Resources>

   <Controls:MetroWindow.RightWindowCommands>
    <Controls:WindowCommands>
        <!--<Button Content="settings" />-->
        <Button>
            <StackPanel Orientation="Horizontal">
                <Rectangle Width="20"
               Height="20"
               Fill="{Binding Foreground, RelativeSource={RelativeSource AncestorType={x:Type Button}}}">
                    <Rectangle.OpacityMask>
                        <VisualBrush Stretch="Fill" Visual="{StaticResource appbar_futurama_fry}" />
                    </Rectangle.OpacityMask>
                </Rectangle>
                <TextBlock Margin="4 0 0 0"
               VerticalAlignment="Center"
               Text="Karthik" />
            </StackPanel>
        </Button>
    </Controls:WindowCommands>
</Controls:MetroWindow.RightWindowCommands>


<Grid DataContext="{Binding Source={StaticResource MainViewModelDataSource}}">
    <Grid.Background>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="#FFF3F3F3" Offset="0"/>
            <GradientStop Color="#FFFBF9F9" Offset="1"/>
            <GradientStop Color="#FFF7F6F6" Offset="0.555"/>
        </LinearGradientBrush>
    </Grid.Background>
    <Border BorderThickness="3" HorizontalAlignment="Left" Height="388" Margin="10,10,0,0" VerticalAlignment="Top" Width="636" CornerRadius="3">
        <Border.Background>
            <LinearGradientBrush EndPoint="0.168,0.166" StartPoint="0.168,0.08">
                <GradientStop Color="#FF39D5FF" Offset="0"/>
                <GradientStop Color="White"/>
            </LinearGradientBrush>
        </Border.Background>
        <Label Content="Master Details" Margin="10,1,502,352" FontWeight="Bold" Foreground="White"/>
    </Border>

    <Border BorderBrush="#FFC7C2C2" BorderThickness="1" HorizontalAlignment="Left" Height="238" Margin="21,100,0,0" VerticalAlignment="Top" Width="187" CornerRadius="3">
        <Border.Background>
            <LinearGradientBrush EndPoint="0.433,0.407" StartPoint="0.435,0.134">
                <GradientStop Color="#29c5ff" Offset="0"/>
                <GradientStop Color="White"/>
            </LinearGradientBrush>
        </Border.Background>
    </Border>
    <Border BorderBrush="#FFC7C2C2" BorderThickness="1" HorizontalAlignment="Left" Height="239" Margin="227,100,0,0" VerticalAlignment="Top" Width="405" CornerRadius="3">
        <Border.Background>
            <LinearGradientBrush EndPoint="0.435,0.378" StartPoint="0.435,0.134">
                <GradientStop Color="#29c5ff" Offset="0"/>
                <GradientStop Color="White"/>
            </LinearGradientBrush>
        </Border.Background>
        <Button Content="DELETE" Margin="211,189,41,21" Width="149" Height="21"/>
    </Border>
    <Label Content="New" HorizontalAlignment="Left" Height="29" Margin="37,103,0,0" VerticalAlignment="Top" Width="87" Foreground="White"/>
    <Label Content="Update" HorizontalAlignment="Left" Height="25" Margin="246,105,0,0" VerticalAlignment="Top" Width="98" Foreground="White"/>
    <TextBox HorizontalAlignment="Left" Height="25" Margin="37,150,0,0" TextWrapping="Wrap" Text="{Binding Path=Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="149" DataContext="{Binding Source={StaticResource PersonDataSource}}"/>
    <TextBox HorizontalAlignment="Left" Height="19" Margin="37,197,0,0" TextWrapping="Wrap" Text="{Binding Path=ID,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="149" DataContext="{Binding Source={StaticResource PersonDataSource}}"/>
    <Button Content="Update" HorizontalAlignment="Left" Height="24" Margin="37,291,0,0" VerticalAlignment="Top" Width="149"/>
    <Button Command="{Binding _addCommand}" Content="edit" HorizontalAlignment="Left" Height="21" Margin="272,291,0,0" VerticalAlignment="Top" Width="149"/>
    <ListView HorizontalAlignment="Left" Height="120" Margin="246,150,0,0" VerticalAlignment="Top" Width="366"  ItemsSource="{Binding MasterData}">
        <ListView.View>
            <GridView>
                <GridViewColumn  Header="Name" Width="120">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Name}" TextWrapping="Wrap"/>  
                        </DataTemplate>   
                    </GridViewColumn.CellTemplate>    
                </GridViewColumn>
                <GridViewColumn Header="ID" Width="120">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding ID}" TextWrapping="Wrap"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Location" Width="125">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Location}" TextWrapping="Wrap"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
    <TextBox HorizontalAlignment="Left" Height="19" Margin="37,241,0,0" TextWrapping="Wrap" Text="{Binding Path=Location,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="149" DataContext="{Binding Source={StaticResource PersonDataSource}}"/>

</Grid>
</Controls:MetroWindow>

1 个答案:

答案 0 :(得分:3)

由于我无法使用您的代码段准确地重现您的问题。所以我已经制作了一个简单的代码示例来实现您描述的目标。我相信你会从中获得一些有用的信息并检查你的代码来解决你的问题。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition>

        </ColumnDefinition>
        <ColumnDefinition>

        </ColumnDefinition>
    </Grid.ColumnDefinitions>

    <StackPanel Grid.Column="0">
        <TextBox Text="{Binding name,Mode=TwoWay}"></TextBox>

        <TextBox Text="{Binding Id,Mode=TwoWay}"></TextBox>

        <TextBox Text="{Binding location,Mode=TwoWay}"></TextBox>

        <Button Content="add new" Command="{Binding AddNew}"></Button>
    </StackPanel>

    <ListView ItemsSource="{Binding persons}" Grid.Column="1">
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Name}"></TextBlock>
                    <TextBlock Text="{Binding ID}" Margin="10 0 0 0"></TextBlock>

                    <TextBlock Text="{Binding Location}" Margin="20 0 0 0"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

MainViewModel.cs

class MainViewModel:ViewModelBase
{
    public ObservableCollection<PersonModel> persons { get; set; }

    private string _name;
    public string name
    {
        get { return _name; }
        set
        {
            _name = value;
            RaisePropertyChanged("name");
        }
    }

    private string _Id;

    public string Id
    {
        get { return _Id; }
        set { _Id = value;
            RaisePropertyChanged("Id");
        }
    }

    private string _location;

    public string location
    {
        get { return _location; }
        set { _location = value;
            RaisePropertyChanged("location");
        }
    }

    public RelayCommand AddNew { get; set; }


    public MainViewModel()
    {
        persons = new ObservableCollection<PersonModel>();
        persons.Add(new PersonModel() {Name="test1",ID="123",Location="u.s." });
        AddNew = new RelayCommand(AddNewPerson);
    }

    private void AddNewPerson()
    {
        PersonModel p = new PersonModel() {Name=name,ID=Id,Location=location };
        persons.Add(p);
    }
}

PersonModel.cs

class PersonModel
{
    public string Name { get; set; }

    public string ID { get; set; }

    public string Location { get; set; }
}

enter image description here