Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否在Viewmodel中保存视图更改?_C#_Wpf_Binding_Oneway - Fatal编程技术网

C# 是否在Viewmodel中保存视图更改?

C# 是否在Viewmodel中保存视图更改?,c#,wpf,binding,oneway,C#,Wpf,Binding,Oneway,我试图显示一个模型,我想在用户单击按钮时保存它。 (将ModelView单向绑定到模型,如果按下保存按钮,我将手动更新源。) 可能吗 这里我用我的问题创建了一个小例子。(不是MVVM!) main window.xaml <Grid> <Grid.DataContext> <ViewModel:MainViewModel/> </Grid.DataContext> <Gr

我试图显示一个模型,我想在用户单击按钮时保存它。 (将ModelView单向绑定到模型,如果按下保存按钮,我将手动更新源。) 可能吗

这里我用我的问题创建了一个小例子。(不是MVVM!)

main window.xaml

<Grid>
        <Grid.DataContext>
            <ViewModel:MainViewModel/>
        </Grid.DataContext>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <local:PersonListView Grid.Column="0" DataContext="{Binding ViewModel_PersonList}"/>
        <local:PersonView Grid.Column="1" DataContext="{Binding ViewModel_Person}"/>
    </Grid>
<ListView ItemsSource="{Binding PersonList}" SelectedItem="{Binding SelectedPerson}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding LastName}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
<Grid DataContext="{Binding}">
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="auto"/>
        <RowDefinition/>
        <RowDefinition Height="auto"/>
    </Grid.RowDefinitions>
    <TextBlock Text="First Name:" Grid.Column="0" Grid.Row="0" Margin="5"/>
    <TextBlock Text="Last Name:" Grid.Column="0" Grid.Row="1" Margin="5"/>
    <TextBlock Text="Age:" Grid.Column="0" Grid.Row="2" Margin="5"/>
    <TextBox Text="{Binding Path=Person.FirstName, UpdateSourceTrigger=Explicit}" Grid.Column="1" Grid.Row="0" Margin="5"/>
    <TextBox Text="{Binding Path=Person.LastName, UpdateSourceTrigger=Explicit}" Grid.Column="1" Grid.Row="1" Margin="5"/>
    <TextBox Text="{Binding Path=Person.Age, UpdateSourceTrigger=Explicit}" Grid.Column="1" Grid.Row="2" Margin="5"/>
    <Button Content="Save" Command="{Binding SaveCommand}" Grid.Column="1" Grid.Row="4"/>
</Grid>
MainViewModel.cs

public class Person : INotifyPropertyChanged
    {
        private string firstName;
        public string FirstName
        {
            get { return firstName; }
            set
            {
                firstName = value;
                OnPropertyChanged("FirstName");
            }
        }

        private string lastName;
        public string LastName
        {
            get { return lastName; }
            set
            {
                lastName = value;
                OnPropertyChanged("LastName");
            }
        }

        private int age;
        public int Age
        {
            get { return age; }
            set
            {
                age = value;
                OnPropertyChanged("Age");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
public class MainViewModel : ViewModelBase
    {
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            ViewModel_PersonList.PersonList.Add(new Model.Person()
            {
                LastName = "Test",
                FirstName = "John",
                Age = 20
            });
            ViewModel_PersonList.PersonList.Add(new Model.Person()
            {
                LastName = "Example",
                FirstName = "Luke",
                Age = 25
            });
            ViewModel_PersonList.SelectedPerson = ViewModel_PersonList.PersonList[1];

            ViewModel_Person.Person = ViewModel_PersonList.SelectedPerson;
        }

        ViewModel.PersonViewModel _ViewModel_Person = new ViewModel.PersonViewModel();
        public ViewModel.PersonViewModel ViewModel_Person
        {
            get
            {
                return _ViewModel_Person;
            }
            set
            {
                _ViewModel_Person = value;
                RaisePropertyChanged("ViewModel_Person");
            }
        }

        ViewModel.PersonListViewModel _ViewModel_PersonList = new ViewModel.PersonListViewModel();
        public ViewModel.PersonListViewModel ViewModel_PersonList
        {
            get
            {
                return _ViewModel_PersonList;
            }
            set
            {
                _ViewModel_PersonList = value;
                RaisePropertyChanged("ViewModel_PersonList");
            }
        }
    }
 public class PersonListViewModel : ViewModelBase
    {
        ObservableCollection<Model.Person> _PersonList = new ObservableCollection<Model.Person>();
        public ObservableCollection<Model.Person> PersonList
        {
            get
            {
                return _PersonList;
            }
            set
            {
                _PersonList = value;
                RaisePropertyChanged("PersonList");
            }
        }

        Model.Person _SelectedPerson = new Model.Person();
        public Model.Person SelectedPerson
        {
            get
            {
                return _SelectedPerson;
            }
            set
            {
                MessengerInstance.Send<Model.Person>(value);
                _SelectedPerson = value;
                RaisePropertyChanged("SelectedPerson");
            }
        }
    }
public class PersonViewModel : ViewModelBase
    {
        public PersonViewModel()
        {
            MessengerInstance.Register<Model.Person>(this, per => Person = per);
        }

        Model.Person _Person = new Model.Person();
        public Model.Person Person
        {
            get
            {
                return _Person;
            }
            set
            {
                _Person = value;
                RaisePropertyChanged("Person");
            }
        }

        private RelayCommand<Model.Person> _SaveCommand;
        public ICommand SaveCommand
        {
            get
            {
                if (_SaveCommand == null)
                    _SaveCommand = new RelayCommand<Model.Person>(SaveCommand_Execute, SaveCommand_CanExecute);
                return _SaveCommand;
            }
        }

        private bool SaveCommand_CanExecute(Model.Person newPerson)
        {
            return true;
        }

        private void SaveCommand_Execute(Model.Person newPerson)
        {
// Do my saving!
        }
    }
public类MainViewModel:ViewModelBase
{
/// 
///初始化MainViewModel类的新实例。
/// 
公共主视图模型()
{
ViewModel\u PersonList.PersonList.Add(new Model.Person())
{
LastName=“测试”,
FirstName=“约翰”,
年龄=20
});
ViewModel\u PersonList.PersonList.Add(new Model.Person())
{
LastName=“示例”,
FirstName=“卢克”,
年龄=25
});
ViewModel\u PersonList.SelectedPerson=ViewModel\u PersonList.PersonList[1];
ViewModel\u Person.Person=ViewModel\u PersonList.SelectedPerson;
}
ViewModel.PersonViewModel\u ViewModel\u Person=新建ViewModel.PersonViewModel();
public ViewModel.PersonViewModel ViewModel\u Person
{
得到
{
返回_ViewModel_Person;
}
设置
{
_ViewModel_Person=值;
RaisePropertyChanged(“视图模型\个人”);
}
}
ViewModel.PersonListViewModel\u ViewModel\u PersonList=新建ViewModel.PersonListViewModel();
public ViewModel.PersonListViewModel ViewModel\u PersonList
{
得到
{
返回_ViewModel_PersonList;
}
设置
{
_ViewModel_PersonList=值;
RaisePropertyChanged(“ViewModel_PersonList”);
}
}
}
PersonListViewModel.css

public class Person : INotifyPropertyChanged
    {
        private string firstName;
        public string FirstName
        {
            get { return firstName; }
            set
            {
                firstName = value;
                OnPropertyChanged("FirstName");
            }
        }

        private string lastName;
        public string LastName
        {
            get { return lastName; }
            set
            {
                lastName = value;
                OnPropertyChanged("LastName");
            }
        }

        private int age;
        public int Age
        {
            get { return age; }
            set
            {
                age = value;
                OnPropertyChanged("Age");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
public class MainViewModel : ViewModelBase
    {
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            ViewModel_PersonList.PersonList.Add(new Model.Person()
            {
                LastName = "Test",
                FirstName = "John",
                Age = 20
            });
            ViewModel_PersonList.PersonList.Add(new Model.Person()
            {
                LastName = "Example",
                FirstName = "Luke",
                Age = 25
            });
            ViewModel_PersonList.SelectedPerson = ViewModel_PersonList.PersonList[1];

            ViewModel_Person.Person = ViewModel_PersonList.SelectedPerson;
        }

        ViewModel.PersonViewModel _ViewModel_Person = new ViewModel.PersonViewModel();
        public ViewModel.PersonViewModel ViewModel_Person
        {
            get
            {
                return _ViewModel_Person;
            }
            set
            {
                _ViewModel_Person = value;
                RaisePropertyChanged("ViewModel_Person");
            }
        }

        ViewModel.PersonListViewModel _ViewModel_PersonList = new ViewModel.PersonListViewModel();
        public ViewModel.PersonListViewModel ViewModel_PersonList
        {
            get
            {
                return _ViewModel_PersonList;
            }
            set
            {
                _ViewModel_PersonList = value;
                RaisePropertyChanged("ViewModel_PersonList");
            }
        }
    }
 public class PersonListViewModel : ViewModelBase
    {
        ObservableCollection<Model.Person> _PersonList = new ObservableCollection<Model.Person>();
        public ObservableCollection<Model.Person> PersonList
        {
            get
            {
                return _PersonList;
            }
            set
            {
                _PersonList = value;
                RaisePropertyChanged("PersonList");
            }
        }

        Model.Person _SelectedPerson = new Model.Person();
        public Model.Person SelectedPerson
        {
            get
            {
                return _SelectedPerson;
            }
            set
            {
                MessengerInstance.Send<Model.Person>(value);
                _SelectedPerson = value;
                RaisePropertyChanged("SelectedPerson");
            }
        }
    }
public class PersonViewModel : ViewModelBase
    {
        public PersonViewModel()
        {
            MessengerInstance.Register<Model.Person>(this, per => Person = per);
        }

        Model.Person _Person = new Model.Person();
        public Model.Person Person
        {
            get
            {
                return _Person;
            }
            set
            {
                _Person = value;
                RaisePropertyChanged("Person");
            }
        }

        private RelayCommand<Model.Person> _SaveCommand;
        public ICommand SaveCommand
        {
            get
            {
                if (_SaveCommand == null)
                    _SaveCommand = new RelayCommand<Model.Person>(SaveCommand_Execute, SaveCommand_CanExecute);
                return _SaveCommand;
            }
        }

        private bool SaveCommand_CanExecute(Model.Person newPerson)
        {
            return true;
        }

        private void SaveCommand_Execute(Model.Person newPerson)
        {
// Do my saving!
        }
    }
公共类PersonListViewModel:ViewModelBase
{
ObservableCollection_PersonList=新的ObservableCollection();
公共观察收集人员
{
得到
{
返回个人列表;
}
设置
{
_个人主义=价值;
RaisePropertyChanged(“个人列表”);
}
}
Model.Person _SelectedPerson=新Model.Person();
公共模型。人员选择人员
{
得到
{
返回所选人员;
}
设置
{
Send(值);
_SelectedPerson=值;
RaiseProperty变更(“选定人员”);
}
}
}
PersonViewModel.cs

public class Person : INotifyPropertyChanged
    {
        private string firstName;
        public string FirstName
        {
            get { return firstName; }
            set
            {
                firstName = value;
                OnPropertyChanged("FirstName");
            }
        }

        private string lastName;
        public string LastName
        {
            get { return lastName; }
            set
            {
                lastName = value;
                OnPropertyChanged("LastName");
            }
        }

        private int age;
        public int Age
        {
            get { return age; }
            set
            {
                age = value;
                OnPropertyChanged("Age");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
public class MainViewModel : ViewModelBase
    {
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            ViewModel_PersonList.PersonList.Add(new Model.Person()
            {
                LastName = "Test",
                FirstName = "John",
                Age = 20
            });
            ViewModel_PersonList.PersonList.Add(new Model.Person()
            {
                LastName = "Example",
                FirstName = "Luke",
                Age = 25
            });
            ViewModel_PersonList.SelectedPerson = ViewModel_PersonList.PersonList[1];

            ViewModel_Person.Person = ViewModel_PersonList.SelectedPerson;
        }

        ViewModel.PersonViewModel _ViewModel_Person = new ViewModel.PersonViewModel();
        public ViewModel.PersonViewModel ViewModel_Person
        {
            get
            {
                return _ViewModel_Person;
            }
            set
            {
                _ViewModel_Person = value;
                RaisePropertyChanged("ViewModel_Person");
            }
        }

        ViewModel.PersonListViewModel _ViewModel_PersonList = new ViewModel.PersonListViewModel();
        public ViewModel.PersonListViewModel ViewModel_PersonList
        {
            get
            {
                return _ViewModel_PersonList;
            }
            set
            {
                _ViewModel_PersonList = value;
                RaisePropertyChanged("ViewModel_PersonList");
            }
        }
    }
 public class PersonListViewModel : ViewModelBase
    {
        ObservableCollection<Model.Person> _PersonList = new ObservableCollection<Model.Person>();
        public ObservableCollection<Model.Person> PersonList
        {
            get
            {
                return _PersonList;
            }
            set
            {
                _PersonList = value;
                RaisePropertyChanged("PersonList");
            }
        }

        Model.Person _SelectedPerson = new Model.Person();
        public Model.Person SelectedPerson
        {
            get
            {
                return _SelectedPerson;
            }
            set
            {
                MessengerInstance.Send<Model.Person>(value);
                _SelectedPerson = value;
                RaisePropertyChanged("SelectedPerson");
            }
        }
    }
public class PersonViewModel : ViewModelBase
    {
        public PersonViewModel()
        {
            MessengerInstance.Register<Model.Person>(this, per => Person = per);
        }

        Model.Person _Person = new Model.Person();
        public Model.Person Person
        {
            get
            {
                return _Person;
            }
            set
            {
                _Person = value;
                RaisePropertyChanged("Person");
            }
        }

        private RelayCommand<Model.Person> _SaveCommand;
        public ICommand SaveCommand
        {
            get
            {
                if (_SaveCommand == null)
                    _SaveCommand = new RelayCommand<Model.Person>(SaveCommand_Execute, SaveCommand_CanExecute);
                return _SaveCommand;
            }
        }

        private bool SaveCommand_CanExecute(Model.Person newPerson)
        {
            return true;
        }

        private void SaveCommand_Execute(Model.Person newPerson)
        {
// Do my saving!
        }
    }
公共类PersonViewModel:ViewModelBase { 公共PersonViewModel() { Register(这个,per=>Person=per); } Model.Person _Person=新Model.Person(); 公共模型。个人 { 得到 { 返回人; } 设置 { _人=价值; RaiseProperty变更(“人员”); } } 专用中继命令_SaveCommand; 公共ICommand SaveCommand { 得到 { 如果(_SaveCommand==null) _SaveCommand=新的RelayCommand(SaveCommand\u Execute,SaveCommand\u CanExecute); 返回_SaveCommand; } } 私有bool SaveCommand_CanExecute(Model.Person newPerson) { 返回true; } 私有void SaveCommand_Execute(Model.Person newPerson) { //做我的储蓄! } }
谢谢大家!

您可以使Mode=TwoWay并使用UpdateSourceTrigger=Explicit。请参阅下面的代码

 <StackPanel>
        <TextBox Name="tb_1" Text="HelloWorld!"/>
        <TextBox Name="tb_2" Text="{Binding Path=Text, ElementName=tb_1, Mode=TwoWay,UpdateSourceTrigger=Explicit}"/>
        <Button Content="Update Source" Click="Button_Click"/>
    </StackPanel>


谢谢!如果你知道解决方案,事情会变得很容易!你知道如何在viewmodel中实现这一点吗?我会在几分钟后发布,如果你愿意,我可以为你提供我的MVVM示例!非常感谢你的帮助!添加您的MVVM示例。这会有帮助的