我有一個由兩個不同的對象類型組成的集合,它們具有相同的基類。子類A需要在單元格中顯示按鈕,而子類B需要在單元格中顯示覆選框(同一列)。如何更改WPF數據網格單元格的內容,具體取決於對象類型
如何在wpf數據網格中完成此操作?
我有一個由兩個不同的對象類型組成的集合,它們具有相同的基類。子類A需要在單元格中顯示按鈕,而子類B需要在單元格中顯示覆選框(同一列)。如何更改WPF數據網格單元格的內容,具體取決於對象類型
如何在wpf數據網格中完成此操作?
下面的代碼純粹是爲了指導和編譯不測試...
你應該使用DataGridTemplateColumn這一點。
指定DataGridTemplateColumn.CellTemplate
如下
<DataTemplate>
<Grid>
<Button Visibility="{Binding BaseClassPropertyValue,
Converter={StaticResource SubclassToVisibilityConverter},
ConverterParameter='Button'}"/>
<ChecBox Visibility="{Binding BaseClassPropertyValue,
Converter={StaticResource SubclassToVisibilityConverter},
ConverterParameter='CheckBox'}"/>
</Grid>
</DataTemplate>
在SubclassToVisibilityConverter.Convert()
方法使用下面的邏輯...
if (parameter == "Button")
{
if (value is ClassA)
{
return Visibility.Visible;
}
else
{
return Visbility.Collapsed;
}
}
else if (parameter == "CheckBox")
{
if (value is ClassB)
{
return Visibility.Visible;
}
else
{
return Visbility.Collapsed;
}
}
讓我知道,如果這有助於。
你總是可以試試這個:
ObservableCollection<MyBaseClass> myCollection = new ObservableCollection<MyBaseClass>;
myCollection.Add(new Subclass_A());
myCollection.Add(new Subclass_B());
...
創建每個子類來包裝你的MyCollection的到的DataGrid的DataTemplates。在這一點上,你將有兩種類型的網格(Subclass_A,Subclass_B)。神奇的是使用DataTemplateSelector您的DataGrid:
<DataGrid ItemTemplateSelector="{DynamicResource GridTemplateSelector}">
有這一點,網格(大多數其實容器)將繪製一個項目時要求DataTemplate中,並相應地適用。
namespace MyNamespace
{
public class GridTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element != null && item != null && item is Subclass_A)
{
return element.FindResource("Subclass_A_DataTemplate") as DataTemplate;
}
if (element != null && item != null && item is Subclass_B)
{
return element.FindResource("Subclass_B_DataTemplate") as DataTemplate;
}
}
}
}
創建兩個DataTemplates
併爲每個模板指定DataType
。然後把內容放入DataGridTemplateColumn
:
<DataGrid>
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl Content="{Binding}">
<ContentControl.Resources>
<DataTemplate DataType="ClassA">
<Button />
</DataTemplate>
<DataTemplate DataType="ClassB">
<CheckBox />
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
肯定會考驗這個明天。當前的解決方案是一個帶有按鈕和複選框的數據模板。然後,他們共享一個視圖類而不是子類,然後共享兩個反向屬性來檢查每種「實例」。使用可見性來顯示/隱藏它們。不是一個優雅的解決方案,但目前工作明天檢查你的解決方案,謝謝。 –
剛試過這個。在DataGrid上我有一個ItemsSource,那麼我應該在中寫什麼? –
只是'{綁定}' – Snowbear