2014-10-27 61 views
0

我有一個DataGrid,它通過數據綁定顯示其行和列。我的問題是,如何清理我的DataGrid的顯示?例如,通過設置列width來擺脫未使用的空間。通常我會設置width爲每,但這一次我甚至不需要在XAML中使用該行(並且它也不工作,因爲我使用數據綁定來填充)。格式化數據綁定DataGrid的顯示屬性

DataGrid使用(查看所有的多餘空間的吧?):

enter image description here

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); 
     } 
    } 
} 

回答

0

如果您不自動生成c您可以控制每列的​​許多屬性。如果您使用width = "*"這是一張通配符,將佔用剩下的空間。

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding TransInfoCollection}" IsReadOnly="True" SelectedItem="{Binding SelectedTransponder}" Margin="12,12,14,60" CanUserResizeColumns="False" CanUserResizeRows="True" > 
    <DataGrid.Columns> 
       <DataGridTextColumn Binding="{Binding Path=Location}" Header="Location" Width="90" /> 
       <DataGridTextColumn Binding="{Binding Path=Transponder}" Header="Transponder" Width="*" />       
    </DataGrid.Columns>  
</DataGrid> 
+0

感謝您的回答@FelixCastor!這看起來像是可以工作的東西,但是我得到一個'InvalidOperationException'(Items Collection在使用'ItemsSource'之前必須是空的),因爲創建這些'DataGridTextColumns'明顯增加了'DataGrid'的ItemsSource。有沒有辦法解決? – 2014-10-29 16:15:08

+0

所以,我不確定爲什麼會拋出一個錯誤。您嘗試顯示的集合是什麼類型的數據結構?上面的例子可以在你有'List list'和'Location'和'Transponder'是SomeObject屬性的上下文中使用。因此,您將'DataGrid'綁定到列表,將列綁定到列表中包含的對象的屬性。 – 2014-10-29 16:43:48

+0

另外,您是否設置了'AutoGenerateColumns =「False」'這很重要? – 2014-10-29 16:47:46