【问题标题】:Update DataGrid Checkbox State By Property that Depends on Other Property通过依赖于其他属性的属性更新 DataGrid 复选框状态
【发布时间】:2020-06-02 04:24:25
【问题描述】:

我有一个模型,其中包含 CanDrawProperty。我想将此属性绑定到 DataGrid CheckBox 的 IsEnabled 属性:

public class Series : INotifyPropertyChanged
{
    private ObservableCollection<DropPhoto> _dropPhotosSeries;
    public ObservableCollection<DropPhoto> DropPhotosSeries
    {
        get
        {
            return _dropPhotosSeries;
        }
        set
        {
            _dropPhotosSeries = value;
            OnPropertyChanged(new PropertyChangedEventArgs("DropPhotosSeries"));
        }
    }

    private bool _canDrawPlot;
    public bool CanDrawPlot
    {
        get
        {
            if (_dropPhotosSeries?.Where(x => x.Drop.RadiusInMeters != null).ToList().Count > 1)
            {
                _canDrawPlot = true;
                return _canDrawPlot;
            }

            _canDrawPlot = false;
            return _canDrawPlot;
        }
        set
        {
            _canDrawPlot = value;
            OnPropertyChanged(new PropertyChangedEventArgs("CanDrawPlot"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChanged?.Invoke(this, e);
    }
}

我想根据这个模型的 CanDrawPlot 属性更新我的 Datagrid CheckBox IsEnabled 状态。但这似乎不起作用。用于 DataGrid 的 XAML:

                    <DataGrid IsReadOnly="True" AutoGenerateColumns="False" SelectionMode="Single" Margin="0" BorderThickness="0" ClipToBounds="True" ItemsSource="{Binding User.UserSeries}" SelectionChanged="SeriesDataGrid_OnSelectionChanged" Name="SeriesDataGrid">
                        <DataGrid.Columns>
                            <DataGridTemplateColumn CanUserResize="False">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <CheckBox IsEnabled="{Binding CanDrawPlot}" Checked="ChooseSeries_Checked" x:Name="ChooseSeries" Height="25"/>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                        </DataGrid.Columns>
                    </DataGrid>

我有类用户。它包含 UserSeries。 UserSeries 有属性 CanDrawPlot:

public class User : INotifyPropertyChanged
{
    private ObservableCollection<Series> _userSeries;
    public ObservableCollection<Series> UserSeries
    {
        get
        {
            return _userSeries;
        }
        set
        {
            _userSeries = value;
            OnPropertyChanged(new PropertyChangedEventArgs("UserSeries"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChanged?.Invoke(this, e);
    }
}

【问题讨论】:

  • User.UserSeriesSeries 类的集合吗?还有,为什么要在属性getter中设置_canDrawPlot
  • 是的。无论如何,这个属性并不意味着要设置。我可以根据条件在 getter 中返回 true 或 false
  • 私有 bool _canDrawPlot; public bool CanDrawPlot { get { if (_dropPhotosSeries?.Where(x => x.Drop.RadiusInMeters != null).ToList().Count > 1) { return true; } 否则 { 返回假; } } 设置 { _canDrawPlot = 值; OnPropertyChanged(new PropertyChangedEventArgs("CanDrawPlot")); } }`

标签: c# wpf checkbox binding


【解决方案1】:

您需要在代码中添加以下几行

在 xaml 中: 您需要添加到绑定 UpdateSourceTrigger

<CheckBox IsEnabled="{Binding CanDrawPlot,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Checked="ChooseSeries_Checked" x:Name="ChooseSeries" Height="25"/>

在 xaml.cs 中你需要创建一个 Series 类的实例

例如:

private Series series = new Series ();

并且在 xaml.cs 的构造函数中你需要写:

DataContext = series;

成功了。

【讨论】:

  • 还是没什么。 CheckBox 似乎没有注意到,CanDrawPlot 属性已更改
猜你喜欢
  • 1970-01-01
  • 2015-02-18
  • 2017-12-16
  • 2016-07-08
  • 1970-01-01
  • 2011-09-09
  • 2017-08-05
  • 2015-11-25
  • 2011-08-20
相关资源
最近更新 更多