(请参阅下面我自己的回答,我将这个渗透过了几天和几天) 我试图在WPF中实现以下场景。
我有一个数据网格,它显示了用于查看和附加数据输入的数据行。这是一个新的应用程序,但有遗留数据。
过去的一个特定领域已随机输入数据。现在我们要将该字段的值限制为特定列表。所以我正在使用DataGridComboBoxColumn。 FWIW我或者用包含ComboBox的DataGridTemplateColumn尝试了这个。
在运行时,如果现有值不在列表中,我希望它仍然显示。我似乎无法实现这一点。虽然我尝试了大量的解决方案(所有失败),但这是最符合逻辑的解决方案。
下拉列表的值列表在名为“months”的Windows资源中定义。
<DataGridComboBoxColumn x:Name="frequencyCombo" MinWidth="100" Header="Frequency"
ItemsSource="{Binding Source={StaticResource months}}"
SelectedValueBinding="{Binding Path=Frequency,UpdateSourceTrigger=PropertyChanged}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="IsSynchronizedWithCurrentItem" Value="False" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
</DataGridComboBoxColumn>
发生的事情是,如果列表中没有值,则显示为空白。我在运行时验证过IsSynchronizedWithCurrentItem元素确实是False。它只是没有做我期待的事情。
也许我只是走错了路。也许我需要将文本框与组合框结合使用。也许我需要编写一些代码,而不仅仅是XAML。我花了好几个小时尝试不同的事情,并且非常感谢解决方案。我有一些使用此类或该控件的建议,但没有解释 如何使用它。
非常感谢!
答案 0 :(得分:5)
我终于解决了这个问题。 诀窍是摆脱组合框并使用一个模板,该模板具有用于显示的文本框和用于编辑的组合框。但是,我仍然花费了几个小时来解决一个新问题...在组合框中进行选择时,它会修改我在网格中也使用了组合框的任何其他行。猜猜是什么解决了这个问题!我之前尝试使用的IsSynchronizedWithCurrentItem属性。 :)
<DataGridTemplateColumn x:Name="frequencyCombo" Header="Frequency">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Frequency}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox
ItemsSource="{Binding Source={StaticResource frequencyViewSource},
TargetNullValue=''}"
SelectedItem="{Binding Path=Frequency}" IsSynchronizedWithCurrentItem="False"
/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
没有丑陋的黑客。下拉列表底部没有任何不可用的选择。没有代码可以添加这些额外的值然后清理它们。
我不会在Mark的建议中删除“答案”,因为它使我能够将应用程序交到我的客户手中,但这是我正在寻找的解决方案。经过数小时的网络搜索,我发现它被埋在一个“connect”项目中。
感谢大家的帮助!
答案 1 :(得分:0)
请你澄清一下这里发生了什么?目前还不清楚“现有值”在运行时是什么 - 如果这是随机输入数据的字段,通过限制它是否意味着您运行某种验证逻辑,尽管您仍希望它显示?
另外,我更喜欢Silverlight方面的东西...... WPF也默认为单向绑定吗?
答案 2 :(得分:0)
您是否尝试在视图模型中使用ObservableCollection或CollectionViewSource,而不是将静态资源和视图模型属性混合为列表中项目的来源?然后,您可以随意插入和删除非标准项目,并随时选择(或不选择)。因此,“正常”列表将具有正常月份,但是当出现奇数时,将其添加到列表中并将其选中。似乎在视图模型中更容易控制。
答案 3 :(得分:0)
为什么不做以下事情:
//create collection
PagedCollectionView view = new PagedCollectionView(e.Result);
view.SortDescriptions.Add(
new SortDescription("Months", ListSortDirection.Ascending));
gridProducts.ItemsSource = view;
//filter collection by category
PagedCollectionView view = new PagedCollectionView(e.Result);
view.Filter = delegate(object filterObject)
{
Product product = (Product)filterObject;
return (product.CategoryName == "Legacy");
};
gridProducts.ItemsSource = view;
//create categories through grouping
PagedCollectionView view = new PagedCollectionView(e.Result);
view.GroupDescriptions.Add(new PropertyGroupDescription("Legacy"));
view.GroupDescriptions.Add(new PropertyGroupDescription("etc..."));
gridProducts.ItemsSource = view;
答案 4 :(得分:0)
试试这个:
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Months}"
Text="{Binding Value}"
IsEditable="True" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>