WPF绑定不断更改已添加的项

时间:2018-05-08 23:57:42

标签: c# wpf mvvm

我要做的是, 我有一个名为Ferramenta的班级应该有一个Atividades类型列表,所以我可以继续将Atividades添加到给定的Ferramenta。 但我遇到麻烦,因为我可以添加一个Atividade就好了,但如果我去更改任何TextBox输入它会自动更改Atividades列表中的atividade,这是没有意义的,因为它应该是一个完全不同的范围。

我可以看到它改变了我输入的那个,因为我有一个显示内容的DataGrid。

XAML:

                    <TextBox Margin="{StaticResource ControlMargin}"
                    Style="{DynamicResource MetroButtonTextBox}" 
                    Text="{Binding Source={StaticResource vm},Path=atividade.Responsavel, UpdateSourceTrigger=PropertyChanged,Mode=OneWayToSource}"
                    Controls:TextBoxHelper.ClearTextButton="True"
                          />
                    <DatePicker
                    Controls:TextBoxHelper.Watermark="Selecione uma data"
                    SelectedDate="{Binding Source={StaticResource vm},Path=atividade.DateInicio,UpdateSourceTrigger=PropertyChanged,Mode=OneWayToSource}"/>
                    <DatePicker
                       Controls:TextBoxHelper.Watermark="Selecione uma data"
                       SelectedDate="{Binding Source={StaticResource vm},Path=atividade.DateTermino,UpdateSourceTrigger=PropertyChanged,Mode=OneWayToSource}"/>
                    <Button Width="40"
                        Height="40"
                        Margin="20"
                        Style="{StaticResource AccentCircleButtonStyle}"
                        Command="{Binding Source={StaticResource vm},Path=addAtividade}"
                        CommandParameter="{Binding Source={StaticResource vm}, Path=atividade}">
                    </Button>

视图模型:

public AdicionarAtividade addAtividade { get; set; }
public Atividade atividade { get; set; }
public Ferramenta ferramenta { get; set; }

public ConsultaAtividadesViewModel(){
    ferramenta = new Ferramenta()
    {
        OrdemServico = "12345", //Debugging purposes
        SFerramenta = "123456",//Debugging purposes
        Peca = "12345",//Debugging purposes
        Atividades = new ObservableCollection<Atividade>()
    };
    addAtividade = new AdicionarAtividade(this);
    atividade = new Atividade();
}

Ferramenta上的重要内容

    class Ferramenta : INotifyPropertyChanged
{
    private ObservableCollection<Atividade> atividades;
    public ObservableCollection<Atividade> Atividades
    {
        get { return atividades; }
        set { atividades = value; OnPropertyChanged("Atividades"); } //I think the problem is here on the setter

    }

注册命令

        ConsultaAtividadesViewModel vm { get; set; } //The View viewModel
    public AdicionarAtividade(ConsultaAtividadesViewModel vm)
    {
        this.vm = vm;
    }
    //CanExecute stripped out for making it easier to understand
    public void Execute(object parameter)
    {
        vm.ferramenta.Atividades.Add(parameter as Atividade);
    }

此外我不知道是否值得添加,但我的想法是,在XAML中,我根据用户输入的内容更改已经设置的Atividade项目然后一旦他按下注册来自ViewModel的Atividade的args传递给命令,然后将命令添加到List中,“打破”绑定。

1 个答案:

答案 0 :(得分:0)

必须更改Atividade构造函数以将Atividade作为参数并设置其变量并将执行更改为

        vm.ferramenta.Atividades.Add(new Atividade((Atividade)parameter));