4

(请参阅下面的我自己的答案,我在让这个渗透几天和几天后想出了)我试图在 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。我花了几个小时尝试不同的事情,并且非常感谢解决方案。我有一些使用这个类或那个控件的建议,但没有解释如何使用它。

非常感谢!

4

5 回答 5

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>

没有丑陋的黑客。下拉列表底部没有不可用的选项。没有代码可以添加这些额外的值然后清理它们。

我不会拿走马克建议的“答案”,因为它使我能够将应用程序交到我的客户手中,但这是我正在寻找的解决方案。经过数小时的网络搜索,我发现它被埋在“连接”项目中。

感谢大家的帮助!

于 2011-01-19T15:06:51.477 回答
0

你能澄清一下这里发生了什么吗?目前尚不清楚运行时的“现有值”是什么 - 如果这是随机输入数据的字段,通过限制它是否意味着您正在运行某种验证逻辑,尽管您仍然希望它显示?

另外,我更偏向于 Silverlight 方面... WPF 是否也默认为单向绑定?

于 2011-01-15T15:58:26.167 回答
0

您是否尝试过在视图模型中使用 ObservableCollection 或 CollectionViewSource,而不是将静态资源和视图模型属性混合为列表中项目的来源?然后您可以随意插入和删除非标准项目,并随时选择(或不选择)它们。因此,“正常”列表将具有正常月份,但是当出现奇怪的月份时,将其添加到列表中并使其选中。似乎在视图模型中专门控制会更容易。

于 2011-01-15T16:31:21.557 回答
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;
于 2011-01-15T20:10:47.663 回答
0

试试这个:

    <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding Months}"
                                  Text="{Binding Value}"
                                  IsEditable="True" />

                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
于 2011-01-15T21:15:53.980 回答