1
我在StackPanel中使用DataGrid來顯示來自數據庫的客戶信息(例如:名字,姓氏,地址等)。我想要做的是讓StackPanel展開並摺疊DataGrid以在需要時顯示其他列。展開/摺疊包含DataGrid的面板
因此,例如:
在啓動時我想的面板能夠摺疊只顯示所有客戶的名字。當按下按鈕時,我希望面板展開以顯示其餘列(姓,地址等)。這可能嗎?
可以擴展器設置崩潰時的最小寬度,不會摺疊整個面板?
更新: 這是我的更新代碼,任何有興趣的人。使用MVVM設計模式和Button Command實現。
查看:我希望在任何時候都顯示第一列,所以我忽略了可見性綁定。 我發現的BindingProxy資源here。
<DataGrid ItemsSource="{Binding Customers}" AutoGenerateColumns="False">
<DataGrid.Resources>
<common:BindingProxy x:Key="Proxy" Data="{Binding}" />
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding FullName}" />
<DataGridTextColumn Header ="First Name" Binding="{Binding FirstName}" Visibility="{Binding Data.DataGridVisibility, Converter={StaticResource BoolToVis}, Source={StaticResource Proxy}}" />
<DataGridTextColumn Header ="Last Name" Binding="{Binding LastName}" Visibility="{Binding Data.DataGridVisibility, Converter={StaticResource BoolToVis}, Source={StaticResource Proxy}}" />
<DataGridTextColumn Header ="Birth Date" Binding="{Binding BirthDate}" Visibility="{Binding Data.DataGridVisibility, Converter={StaticResource BoolToVis}, Source={StaticResource Proxy}}" />
<DataGridTextColumn Header ="Active" Binding="{Binding Active}" Visibility="{Binding Data.DataGridVisibility, Converter={StaticResource BoolToVis}, Source={StaticResource Proxy}}" />
</DataGrid.Columns>
</DataGrid>
<Button Content="Toggle Columns" x:Name="ToggleColumns" Command="{Binding Path=ToggleColumnsCommand}"/>
MODEL:
private string _name;
public string Name
{
get
{
return _firstname + " " + _lastname;
}
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged("Name");
}
}
}
private string _firstname;
public string FirstName
{
get { return _firstname; }
set
{
if (_firstname != value)
{
_firstname = value;
OnPropertyChanged("FirstName");
}
}
}
private string _lastname;
public string LastName
{
get { return _lastname; }
set
{
if (_lastname != value)
{
_lastname = value;
OnPropertyChanged("LastName");
}
}
}
private DateTime _birthdate;
public DateTime BirthDate
{
get { return _birthdate; }
set
{
if (_birthdate != value)
{
_birthdate = value;
OnPropertyChanged("BirthDate");
}
}
}
private int _addressid;
public int AddressId
{
get { return _addressid; }
set
{
if (_addressid != value)
{
_addressid = value;
OnPropertyChanged("AddressId");
}
}
}
private bool _active;
public bool Active
{
get { return _active; }
set
{
if (_active != value)
{
_active = value;
OnPropertyChanged("Active");
}
}
}
private DateTime _datecreated;
public DateTime DateCreated
{
get { return _datecreated; }
set
{
if (_datecreated != value)
{
_datecreated = value;
OnPropertyChanged("DateCreated");
}
}
}
private DateTime _dateupdated;
public DateTime DateUpdated
{
get { return _dateupdated; }
set
{
if (_dateupdated != value)
{
_dateupdated = value;
OnPropertyChanged("DateUpdated");
}
}
}
public static PhysicianModel Create(IDataRecord record)
{
return new PhysicianModel
{
FirstName = record["first_name"].ToString(),
LastName = record["last_name"].ToString(),
BirthDate = (DateTime) record["birth_date"],
AddressId = Convert.ToInt32(record["address_id"]),
Active = (bool) record["active"],
DateCreated = (DateTime) record["date_created"],
DateUpdated = (DateTime) record["date_updated"]
};
}
視圖模型:
private bool _dgVisibility;
public bool DataGridVisibility
{
get { return _dgVisibility; }
set
{
if (_dgVisibility != value)
{
_dgVisibility = value;
OnPropertyChanged("DataGridVisibility");
}
}
}
public ICommand ToggleColumnsCommand
{
get;
private set;
}
private bool CanExecuteToggleColumnsCommand(object obj)
{
return true;
}
private void CreateToggleColumnsCommand()
{
ToggleColumnsCommand = new RelayCommand(ToggleColumnsExecute, CanExecuteToggleColumnsCommand);
}
public void ToggleColumnsExecute(object obj)
{
if (!DataGridVisibility)
DataGridVisibility = true;
else
DataGridVisibility = false;
}
希望這有助於任何人需要它。
我實現了它,它工作得很好。我的表中有很多列,XAML變得相當大,是否有更通用的方法來代替手動輸入文本標題? – wojg21 2014-09-30 19:25:58
在數據網格上設置AutoGenerateColumns =「True」。另外,您是否可以將此答案標記爲已接受? – 2014-09-30 19:34:36