首页 > 解决方案 > WPF 绑定不断更改已添加的项目

问题描述

我想做的是,我有一个名为 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 的参数就会传递给然后将其添加到列表中的命令,“打破”界限。

标签: c#wpfmvvm

解决方案


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

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

推荐阅读