设置堆叠项目在数据网格上的可见性
Setting visibility of stacked item on a datagrid
我试图根据 WPF 数据网格中不同列中的下拉菜单,在数据网格的堆栈面板中显示文本框或按钮。下面是基本代码。实际实现将为每个字段将绑定值绑定到数据源。寻找一种简单优雅的方法来根据从下拉列表中选择的值设置文本框和按钮的可见性。感谢任何帮助:
<Grid Name="dg1">
<DataGrid AutoGenerateColumns="False" Height="200" Name="dataGrid1" Width="500" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="Name" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Height="30">
<TextBox Name="tbName" Width="100" />
<Button Name="btn1" Content="ADD ME" Width="100" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Choice" Width="150" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Name="combo1" >
<ComboBoxItem Content="ShowButton" />
<ComboBoxItem Content="ShowText" />
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
我有一个答案...
分析第一个回复后拼凑出以下解决方案
XAML
<Window.Resources>
<local:ChoiceToVisibilityConverter x:Key="choice2visibilityConverter" />
<local:ChoiceList x:Key="ChoiceList" />
</Window.Resources>
<Grid Name="dg1">
<DataGrid AutoGenerateColumns="False" Height="200" Name="dataGrid1" Width="500" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="Name" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Height="30">
<TextBox Name="tbName" Width="100" Visibility="{Binding Choice, Converter={StaticResource choice2visibilityConverter},ConverterParameter=TextBox} />
<Button Name="btn1" Content="ADD ME" Width="100" Visibility="{Binding Choice, Converter={StaticResource choice2visibilityConverter},ConverterParameter=TextBox} />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Choice" Width="150" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Name="combo1"
SelectedValue="{Binding Choice, NotifyOnSourceUpdated=True,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{StaticResource ChoiceList }"
>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
C#代码:
public class ChoiceToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value.ToString().CompareTo("ShowText") == 0)
return Visibility.Visible ;
return Visibility.Hidden ;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}
public class ChoiceList : List<string>
{
public ChoiceList()
{
this.Add("ShowText");
this.Add("ShowButton");
}
}
假设您的 DataGrid 绑定到模型的集合 class,其中包含有关单行的信息。
您可以简单地添加一个 属性 SelectedRow
并将其与 DataGrid SelectedItem
属性 绑定。在您的列数据模板中,使用值转换器并根据需要绑定到 show/hide。
类似的东西:
<Window.Resources>
<local:ChoiceToVisibilityConverter x:Key="choice2visibilityConverter" />
</Window.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Name" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Height="30">
<TextBox Name="tbName" Width="100" Visibility="{Binding SelectedRow.Choice, Converter={StaticResource choice2visibilityConverter}, ConverterParameter=fromTextBox}"/>
<Button Name="btn1" Content="ADD ME" Width="100" Visibility="{Binding SelectedRow.Choice, Converter={StaticResource choice2visibilityConverter}, ConverterParameter=fromButton}"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Choice" Width="150" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Name="combo1" SelectedValue="{Binding SelectedRow.Choice}" SelectedValuePath="Content" >
<ComboBoxItem Content="ShowButton" />
<ComboBoxItem Content="ShowText" />
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
因此您可以在此处根据所选选项和转换器参数选择 return 在 ValueConverter 中的可见性。
我试图根据 WPF 数据网格中不同列中的下拉菜单,在数据网格的堆栈面板中显示文本框或按钮。下面是基本代码。实际实现将为每个字段将绑定值绑定到数据源。寻找一种简单优雅的方法来根据从下拉列表中选择的值设置文本框和按钮的可见性。感谢任何帮助:
<Grid Name="dg1">
<DataGrid AutoGenerateColumns="False" Height="200" Name="dataGrid1" Width="500" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="Name" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Height="30">
<TextBox Name="tbName" Width="100" />
<Button Name="btn1" Content="ADD ME" Width="100" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Choice" Width="150" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Name="combo1" >
<ComboBoxItem Content="ShowButton" />
<ComboBoxItem Content="ShowText" />
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
我有一个答案... 分析第一个回复后拼凑出以下解决方案
XAML
<Window.Resources>
<local:ChoiceToVisibilityConverter x:Key="choice2visibilityConverter" />
<local:ChoiceList x:Key="ChoiceList" />
</Window.Resources>
<Grid Name="dg1">
<DataGrid AutoGenerateColumns="False" Height="200" Name="dataGrid1" Width="500" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="Name" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Height="30">
<TextBox Name="tbName" Width="100" Visibility="{Binding Choice, Converter={StaticResource choice2visibilityConverter},ConverterParameter=TextBox} />
<Button Name="btn1" Content="ADD ME" Width="100" Visibility="{Binding Choice, Converter={StaticResource choice2visibilityConverter},ConverterParameter=TextBox} />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Choice" Width="150" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Name="combo1"
SelectedValue="{Binding Choice, NotifyOnSourceUpdated=True,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{StaticResource ChoiceList }"
>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
C#代码:
public class ChoiceToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value.ToString().CompareTo("ShowText") == 0)
return Visibility.Visible ;
return Visibility.Hidden ;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}
public class ChoiceList : List<string>
{
public ChoiceList()
{
this.Add("ShowText");
this.Add("ShowButton");
}
}
假设您的 DataGrid 绑定到模型的集合 class,其中包含有关单行的信息。
您可以简单地添加一个 属性 SelectedRow
并将其与 DataGrid SelectedItem
属性 绑定。在您的列数据模板中,使用值转换器并根据需要绑定到 show/hide。
类似的东西:
<Window.Resources>
<local:ChoiceToVisibilityConverter x:Key="choice2visibilityConverter" />
</Window.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Name" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Height="30">
<TextBox Name="tbName" Width="100" Visibility="{Binding SelectedRow.Choice, Converter={StaticResource choice2visibilityConverter}, ConverterParameter=fromTextBox}"/>
<Button Name="btn1" Content="ADD ME" Width="100" Visibility="{Binding SelectedRow.Choice, Converter={StaticResource choice2visibilityConverter}, ConverterParameter=fromButton}"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Choice" Width="150" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Name="combo1" SelectedValue="{Binding SelectedRow.Choice}" SelectedValuePath="Content" >
<ComboBoxItem Content="ShowButton" />
<ComboBoxItem Content="ShowText" />
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
因此您可以在此处根据所选选项和转换器参数选择 return 在 ValueConverter 中的可见性。