【发布时间】:2013-04-19 14:32:41
【问题描述】:
所以,这是我的场景:我有一个ComboBox,其中itemssource 是各种标题及其ID 的Dictionary<int, string>。这些标题可以在将来的某个时候禁用,因此不应再显示在 ComboBox 中。但是,在查看旧项目时,除了当前活动的标题外,我仍然需要能够显示这个旧值。我将尝试在下面更好地可视化。
今天:
ComboBox 项目包括
- 1,标题1
- 2,标题2
- 3,标题3
Title3 被选中,ID (3) 被存储。
明天:
Title3 被禁用,Title4 被添加,所以现在的项目包括
- 1,标题1
- 2,标题2
- 4,标题4
但是,如果我们昨天的值是我们绑定的值 (ID 3),则没有匹配项。理想情况下,我想像这样将我们的旧项目附加到末尾:
- 1,标题1,
- 2,标题2
- 4,标题4
- 3,标题3
启用和禁用标题显然会有单独的列表,任何未正确绑定的项目都可以引用禁用标题变量。
我已经调查了fallbackValues 甚至PriorityBindings,但似乎无法找到一种方法让它们适合我正在尝试做的事情。也许某种转换器与fallbackValue 一起使用?感谢您的帮助和反馈。
另外,作为参考,这是我目前正在使用的代码(我希望在数据网格中执行此操作)。
WPF:
<DataGridTemplateColumn x:Name="tkTitle" Header="Title" Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.TaskTitles, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}" SelectedValue="{Binding Path=tkttID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="Key" DisplayMemberPath="Value" Width="Auto" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
ViewModel 中的相关代码:
public Dictionary<int, string> TaskTitles
{
get
{
return BestClass.taskTitles;
}
}
编辑 - 工作代码 这是我用来让一切正常工作的代码。 ItemsSource 已更新为带有转换器的 MultiBinding。 MultiBinding 包含活动任务标题、所有任务标题和 ID。这些都被传递给转换器,因此在活动列表中检查 ID,如果它不活动则添加。感谢大家的帮助!
WPF
<DataGridTemplateColumn x:Name="tkTitle" Header="Title" Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedValue="{Binding Path=tkttID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="Key" DisplayMemberPath="Value" Width="Auto">
<ComboBox.ItemsSource>
<MultiBinding Converter="{StaticResource CheckDisabledTaskTitle}" Mode="OneWay">
<MultiBinding.Bindings>
<Binding Path="DataContext.TaskTitles" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}" />
<Binding Path="DataContext.AllTaskTitles" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}" />
<Binding Path="tkttID" />
</MultiBinding.Bindings>
</MultiBinding>
</ComboBox.ItemsSource>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
转换器的代码隐藏
class CheckDisabledTaskTitle : IMultiValueConverter
{
//values[0] - Active values
//values[1] - All values (including disabled)
//values[2] - Current ID
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//Check to see if the active values contain our current ID
if (((Dictionary<int, string>)values[0]).ContainsKey((int)values[2]))
{
//They do, so return just the active values
return values[0];
}
else
{
//They don't, so we'll add only our disabled value to the active list
((Dictionary<int, string>)values[0]).Add((int)values[2], ((Dictionary<int, string>)values[1])[((int)values[2])]);
//Then give that back
return values[0];
}
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
【问题讨论】:
标签: c# wpf datagrid combobox fallbackvalue