我进行了广泛的搜索,但找不到解决我的问题的方法。 我正在使用 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 对象上都被选择) - .
所以我不太清楚为什么 IsObjectSelected 属性有时为 true,有时为 false(即使选择了该行)。
我尝试将其绑定到单个对象(而不是对象列表),但仍然不起作用。此外,我使用了几次包装器,并且它总是有效...这是否与我从两个 DataGrid 中选择每个对象的事实有关? 谢谢!
您必须在包装类中实现
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>