0
我有一个DataGrid
,它通过数据绑定显示其行和列。我的问题是,如何清理我的DataGrid
的显示?例如,通过设置列width
来摆脱未使用的空间。通常我会设置width
为每,但这一次我甚至不需要在XAML中使用该行(并且它也不工作,因为我使用数据绑定来填充)。格式化数据绑定DataGrid的显示属性
我DataGrid
使用(查看所有的多余空间的吧?):
XAML的DataGrid
的:
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding TransInfoCollection}" IsReadOnly="True" SelectedItem="{Binding SelectedTransponder}" Margin="12,12,14,60" CanUserResizeColumns="False" CanUserResizeRows="True" >
<DataGrid.Columns>
<DataGridTextColumn Header="{DynamicResource transLocation}" Binding="{Binding Path=Location}" Width="90" />
<DataGridTextColumn Header="{DynamicResource transponder}" Binding="{Binding Path=Tranponder}" Width="*" />
</DataGrid.Columns>
</DataGrid>
窗口视图模型:
public class TransponderMaintenanceViewModel : PropertyChangedBase
{
private ObservableCollection<TransponderProps> _transInfoCollection; //DataGrid Collection
private TransponderProps _selectedTransponder;
private Command _deleteCommand;
HierarchicalVM pathLocationsNode = App.MainTree.Data[2].Children[0]; //Path -> Locations
public TransponderMaintenanceViewModel()
{
TransInfoCollection = new ObservableCollection<TransponderProps>();
_deleteCommand = new Command(DeleteCommand_Ops);
for (int i = 0; i < pathLocationsNode.Children.Count(); i++) //Adds Transponder information to DataGrid
{
if (pathLocationsNode.Children[i].Children[0].Children.Count() > 0)
{
for (int j = 0; j < pathLocationsNode.Children[i].Children[0].Children.Count(); j++)
{
TransInfoCollection.Add(new TransponderProps { Location = new MultiItemString(new[] { Regex.Match(pathLocationsNode.Children[i].DisplayName.Value, @"\d+").Value }, false),
Transponder = new MultiItemString(new[] { pathLocationsNode.Children[i].Children[0].Children[j].DisplayName.Value }, false) });
}
}
}
}
//Prop for Collection that will store Transponders and their Location
public ObservableCollection<TransponderProps> TransInfoCollection
{
get { return _transInfoCollection; }
set
{
_transInfoCollection = value;
NotifyPropertyChange(() => TransInfoCollection);
}
}
//Prop for the SelectedItem in the DataGrid
public TransponderProps SelectedTransponder
{
get { return _selectedTransponder; }
set
{
_selectedTransponder = value;
NotifyPropertyChange(() => SelectedTransponder);
}
}
//Delete Command
public Command DeleteCommand { get { return _deleteCommand; } }
private void DeleteCommand_Ops()
{
for (int i = 0; i < pathLocationsNode.Children.Count(); i++) //Delete Transponder from CartTools
{
for (int j = 0; j < pathLocationsNode.Children[i].Children[0].Children.Count(); j++)
{
if (pathLocationsNode.Children[i].Children[0].Children[j].DisplayName.Value == SelectedTransponder.Transponder.Value)
{
var transParent = pathLocationsNode.Children[i].Children[0];
transParent.Children.Remove(transParent.Children[j]);
}
}
}
TransInfoCollection.Remove(SelectedTransponder); //Remove Transponder from DataGrid
}
}
public class TransponderProps : PropertyChangedBase
{
private MultiItemString _location, _transponder;
public TransponderProps()
{
}
public MultiItemString Location
{
get { return _location; }
set
{
_location = value;
NotifyPropertyChange(() => Location);
}
}
public MultiItemString Transponder
{
get { return _transponder; }
set
{
_transponder = value;
NotifyPropertyChange(() => Transponder);
}
}
}
感谢您的回答@FelixCastor!这看起来像是可以工作的东西,但是我得到一个'InvalidOperationException'(Items Collection在使用'ItemsSource'之前必须是空的),因为创建这些'DataGridTextColumns'明显增加了'DataGrid'的ItemsSource。有没有办法解决? – 2014-10-29 16:15:08
所以,我不确定为什么会抛出一个错误。您尝试显示的集合是什么类型的数据结构?上面的例子可以在你有'List list'和'Location'和'Transponder'是SomeObject属性的上下文中使用。因此,您将'DataGrid'绑定到列表,将列绑定到列表中包含的对象的属性。 –
2014-10-29 16:43:48
另外,您是否设置了'AutoGenerateColumns =“False”'这很重要? – 2014-10-29 16:47:46