ObservableCollection项 - 如果设置了标志,则修改单个项的属性

时间:2015-12-29 08:36:02

标签: c# wpf xaml mvvm

我有一个数据网格,可观察的集合绑定到它:

private ObservableCollection<RequestParameter> _parameters = new ObservableCollection<RequestParameter>();

    public ObservableCollection<RequestParameter> Parameters
    {
        get { return _parameters; }
        set { Set(ref _parameters, value); }
    }

    private bool _isPostRequest;
    public bool IsPostRequest
    {
        get { return _isPostRequest; }
        set { Set(ref _isPostRequest, value); }
    }

模特:

public class RequestParameter
{
    public string Key { get; set; }
    public string Value { get; set; }
    public bool IsPostParameter { get; set; }
}

所以在用户界面上,我有一个复选框和一个数据网格

<DataGrid HeadersVisibility="Column" RowHeaderWidth="0" Grid.Row="2" Grid.ColumnSpan="2" ItemsSource="{Binding Parameters}" CanUserAddRows="True" AutoGenerateColumns="False" CanUserDeleteRows="True" MinHeight="140">
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="Key" Binding="{Binding Key}" Width="*"/>
                                <DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*"/>
                            </DataGrid.Columns>
                        </DataGrid>
  <CheckBox HorizontalAlignment="Right" IsChecked="{Binding IsPostRequest}"/>

因此,如果单击该复选框,则集合中所有项目的IsPostParameter应设置为True

我能想到的唯一方法是在Parameters字段的getter或setter中,检查viewmodel的IsPostRequest属性,如果是,则运行所有参数并设置旗。 有没有更好的解决方案?

2 个答案:

答案 0 :(得分:1)

向视图模型添加一个Command,并将CheckBox命令属性设置为该命令。并将IsChecked作为参数传递:CommandParameter="{Binding IsChecked, RelativeSource={RelativeSource Self}, Mode=OneWay} 然后在您的命令中迭代您的集合项并将您的字段设置为适当的值。

答案 1 :(得分:1)

我认为你可以通过IsPostRequest setter属性检查它

    private bool _isPostRequest;
    public bool IsPostRequest
    {
        get { return _isPostRequest; }
        set
        {
            _isPostRequest = value;
            Parameters.ToList().ForEach(x => x.IsPostParameter = value);
            RaisePropertyChanged("IsPostRequest");
        }    
    }