【发布时间】:2020-05-01 06:26:49
【问题描述】:
我有一个 DataGrid,它绑定到如下所示的具有各种属性的列表。我有 2 个要求正在努力解决。
<DataGrid ItemsSource="{Binding Path=VariedObjectList}"
AutoGeneratingColumn="OnAutoGeneratingColumn" x:Name="dataGridView"
SelectionMode="Single" AutoGenerateColumns="true" CanUserAddRows="true" CanUserDeleteRows="true />
- 对于文本框property1中的特定值,property2中显示的项目列表应该动态变化。所以,例如,在这里 如果 'Value' 的值为 2,则 'ValueRange' 应显示一个下拉列表,其中项目为“2-5”和“5.81-6.6”作为列表项,如果值为 8,则列表更改为 => 7.9-8.8; 8.81-11.2 等等,如下图所示。
我怎样才能做到这一点?我想像上面的 xaml 一样保持与整个集合本身的绑定。
public class VariedObjectList
{
public Modes ModeType { get; set; }
public int Value{ get; set; }
public <dataType??> ValueRange { get; set; } // not sure what should be the type for ValueRange
}
public enum Mode
{
ModeSlow = 0,
ModeFast = 1,
ModeNeutral = 2,
ModeNone = 3
}
- 如果我的“ModeType”属性是“ModeSlow”或“ModeFast”,则“ValueRange”需要是一个下拉列表。如果 ModeType 是“ModeNeutral”,那么 ValueRange 必须接受一个文本框。我如何做到这一点?
我按照 Keith 的建议修改了代码,虽然我的大部分更改都有效,但我在以下方面存在问题
(i)我无法让组合框可编辑工作。当我输入时它具有价值,但是一旦我的焦点离开该字段,文本就会消失,并且对于输入的文本,“SelectedValueRange”永远不会发生绑定。但是当有一个列表并且我从列表中选择任何值时,它会绑定到“SelectedValueRange”,但不适用于文本输入。
(ii)ModeType 是枚举,默认情况下输入新行时,我希望它显示“ModeSlow”但它为空。此外,如果我更新一行,所有先前的行也会更新为最新的值。它的行为很奇怪,但我知道我遗漏了一些东西。
public class VariedObjectList : INotifyPropertyChanged
{
public Mode ModeType { get; set; } = Mode.ModeSlow;
private int val;
public int Value {
get { return val; }
set
{
val = value;
OnPropertyChanged("Value");
SetValueRangeList();
}
}
public List<strings> ValueRange { get; set; }
public string SelectedValueRange {get; set;}
}
下面是更新的xaml
我正在为枚举设置 ObjectDataProvider
<Window.Resources>
<ObjectDataProvider x:Key="EnumProvider" MethodName="GetValues"
ObjectType="{x:Type System:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:Modes"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources >
<DataGrid x:Name="dataGridView" Grid.Row="0" DataGridCell.Selected="DataGridGotFocus" ItemsSource="{Binding VariedObjectList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False"
CanUserDeleteRows="true" SelectionMode="Single" CanUserAddRows="True" VerticalScrollBarVisibility="Auto" ScrollViewer.CanContentScroll="True">
<DataGrid.Columns>
<DataGridTemplateColumn Header=" ModeType " >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Source={StaticResource EnumProvider}}"
SelectedItem="{Binding Path= ModeType
, UpdateSourceTrigger=LostFocus, Mode=TwoWay}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Value" Binding="{Binding Value, UpdateSourceTrigger=LostFocus}"/>
<DataGridTemplateColumn Header="ValueRange" >
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox IsEditable="True" SelectedValue="{Binding SelectedValueRange, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding Path= ValueRange }" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding SelectedValueRange, UpdateSourceTrigger=LostFocus, Mode=TwoWay}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
有人可以指出我在示例代码中缺少什么吗?谢谢。
【问题讨论】:
-
这可能吗?我看到这么多观点,但没有回应。请让我知道是否需要更多信息。
标签: c# wpf drop-down-menu datagrid itemsource