使用wpf datagridcomboboxcolumn的IsSynchronizedWithCurrentItem

Jul*_*man 4 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>
Run Code Online (Sandbox Code Playgroud)

发生的事情是,如果列表中没有值,则显示为空白.我在运行时验证过IsSynchronizedWithCurrentItem元素确实是False.它只是没有做我期待的事情.

也许我只是走错了路.也许我需要将文本框与组合框结合使用.也许我需要编写一些代码,而不仅仅是XAML.我花了好几个小时尝试不同的事情,并且非常感谢解决方案.我有一些建议使用这个类或那个控件但没有解释如何使用它.

谢谢你!

Jul*_*man 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>
Run Code Online (Sandbox Code Playgroud)

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

我不打算删除Mark的建议中的"答案",因为它使我能够将应用程序交到我的客户手中,但这是我正在寻找的解决方案.经过数小时的网络搜索,我发现它被埋在一个" 连接 "项目中.

感谢大家的帮助!