使用wpf datagridcomboboxcolumn的IsSynchronizedWithCurrentItem

时间:2011-01-15 15:22:28

标签: wpf combobox data-synchronization

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

非常感谢!

5 个答案:

答案 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>