Revit 2021.1 - 选择行时 DataGridRow.IsSelected 属性并不总是 true

问题描述 投票:0回答:1

我进行了广泛的搜索,但找不到解决我的问题的方法。 我正在使用 c# 和 wpf 为 Revit 2021.1 编写简单的插件。

这是我的 .xaml 文件中的 DataGrid 及其 RowStyle:

    <DataGrid Grid.Row="1"
              Grid.Column="0"
              HorizontalAlignment="Left"
              Margin="10,0,10,10"
              ItemsSource="{Binding ListOfElementParameterWrappers, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
              RowStyle="{StaticResource RowToBeSelectedStyle}"
              AutoGenerateColumns="False"
              VerticalScrollBarVisibility="Auto"
              HorizontalScrollBarVisibility="Hidden"
              CanUserAddRows="False"
              CanUserResizeColumns="False"
              CanUserSortColumns="False"
              IsReadOnly="False"
              SelectionMode="Single"
              SelectionUnit="FullRow">
    </DataGrid>

<Window.Resources>
    <Style x:Key="RowToBeSelectedStyle" TargetType="{x:Type DataGridRow}">
        <Setter Property="IsSelected" Value="{Binding IsObjectSelected}"/>
    </Style>
</Window.Resources>

DataGrid 绑定到 ViewModel 中的 ElementParameterWrapper 对象列表。 ElementParameterWrapper 对象如下所示:

public ElementParameterWrapper(Parameter parameter)
{
    Name = parameter.Definition.Name;
    Id = parameter.Id;
    if (parameter.IsShared)
    {
        GUID = parameter.GUID;
    }
}
public string Name { get; set; }
public ElementId Id { get; set; }
public Guid GUID { get; set; }
private bool isObjectSelected;
public bool IsObjectSelected
{
    get { return isObjectSelected; }
    set { isObjectSelected = value; }
}

因此 IsObjectSelected 属性绑定到 DataGridRow.IsSelected 属性。然而! ElementParameterWrapper 属性 IsObjectSelected 并不总是 true(即使它被选中)。在图片上可以看到如何选择 ElementParameterWrapper 对象(有绑定到数据网格的列表,并且在每个 ElementParameterWrapper 对象上都被选择) - Revit Plugin Window .

所以我不太清楚为什么 IsObjectSelected 属性有时为 true,有时为 false(即使选择了该行)。

我尝试将其绑定到单个对象(而不是对象列表),但仍然不起作用。此外,我使用了几次包装器,并且它总是有效...这是否与我从两个 DataGrid 中选择每个对象的事实有关? 谢谢!

c# wpf revit-api
1个回答
0
投票

您必须在包装类中实现

INotifyPropertyChanged
才能使任何双向绑定发挥作用。请参阅 MSDN 上的示例

此外,不确定绑定到

IsSelected
DataGridRow
属性是否可行,而是尝试在
SelectedItem
(托管
ViewModel
的类)中创建一个
ListOfElementParameterWrappers
属性并将其绑定到xaml 中
DataGrid
SelectedItem
属性。
ListOfElementParameterWrappers
应该是
ObservableCollection<ElementParameterWrapper>
类型,而不是通用列表(请参阅本文)。

生成的代码可能如下所示:

包装器类:

public ElementParameterWrapper(Parameter parameter):INotifyPropertyChanged
{
    Name = parameter.Definition.Name;
    Id = parameter.Id;
    if (parameter.IsShared)
    {
        GUID = parameter.GUID;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public string Name { get; set; }
    public ElementId Id { get; set; }
    public Guid GUID { get; set; }
    private bool isObjectSelected;
    public bool IsObjectSelected
    {
        get { return isObjectSelected; }
        set { 
              isObjectSelected = value;
              OnPropertyChanged();
            }
    }

    protected void OnPropertyChanged([CallerMemberName] string name = null)
      {
          PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
      }
}

ViewModel类:

    public class MyViewModel : INotifyPropertyChanged
    {
      public MyViewModel (ICollection wrapperCollection){
            ListOfElementParameterWrappers = new ObservableCollection<ElementParameterWrapper>(wrapperCollection);
            SelectedItem = ListOfElementParameterWrappers.FirstOrDefault();
      }
      
      public ObservableCollection<ElementParameterWrapper> ListOfElementParameterWrappers {get; set;}
      
      private ElementParameterWrapper _selecteItem;
      public ElementParameterWrapper SelectedItem {
          get {return _selectedItem;}
          set {
                _selectedItem = value;
                OnPrepertyChanged();
               }
      
      protected void OnPropertyChanged([CallerMemberName] string name = null)
      {
          PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
      }
    }

xaml

    <DataGrid Grid.Row="1"
          Grid.Column="0"
          HorizontalAlignment="Left"
          Margin="10,0,10,10"
          ItemsSource="{Binding ListOfElementParameterWrappers, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
 
          SelecteItem="{Binding SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

          RowStyle="{StaticResource RowToBeSelectedStyle}"
          AutoGenerateColumns="False"
          VerticalScrollBarVisibility="Auto"
          HorizontalScrollBarVisibility="Hidden"
          CanUserAddRows="False"
          CanUserResizeColumns="False"
          CanUserSortColumns="False"
          IsReadOnly="False"
          SelectionMode="Single"
          SelectionUnit="FullRow">
</DataGrid>
© www.soinside.com 2019 - 2024. All rights reserved.