【问题标题】:wpf combobox not updating properlywpf 组合框没有正确更新
【发布时间】:2016-01-25 23:04:54
【问题描述】:

我是 wpf 的新手,并且与这个问题斗争了好几天。我有一个组合框,其中包含数据视图作为项目源。它正确显示值,但当我重新运行应用程序时,selecteditem 始终为空。

combobox绑定的ChargeCodeValidValues对象:

public class ChargeCodeValidValues
{
    #region Properties

    public DataTable ChargeCodesValidValuesTable { get; set; }
    public DataView dvChargeCodeValidValues { get; set; }       

    #endregion
    #region Constructor

    public ChargeCodeValidValues()
    {
        LoadChargeCodesValidValues();
    }

    public void LoadChargeCodesValidValues()
    {
        Database db = new Database();
        DataTable dataTable = db.ExecuteQuery("upGet_ChargeCodesValidValues", "ChargeCodesValidValues", "ID");

        this.ChargeCodesValidValuesTable = dataTable;
        this.dvChargeCodeValidValues = ChargeCodesValidValuesTable.DefaultView;
    }  

XAML:

 <DataTemplate x:Key="combodescriptionTemplate">
      <ComboBox Name="cboCombo"
                Loaded="cboCombo_Loaded">
           <ComboBox.DataContext>
                <Objects:ChargeCodeValidValues/>
           </ComboBox.DataContext>
      </ComboBox>
 </DataTemplate>  

 <local:TotalCellTemplateSelector x:Key="totalcellTemplateSelector" 
           combodescriptionTemplate="{StaticResource combodescriptionTemplate}"/>

gridview 列:

<dxg:GridColumn Header="Description" FieldName="Description" Width="Auto" MinWidth="132" AllowMoving="False" CellTemplateSelector="{StaticResource totalcellTemplateSelector}" /> -->

此列默认为文本框。它根据其他列的值更改为组合框

代码:

 private void cboCombo_Loaded(object sender, RoutedEventArgs e)
 {
      ComboBox cmb = sender as ComboBox;
      DataTable dtChargeCodeValidValues = oChargeCodesValidvalues.ChargeCodesValidValuesTable.Copy();
      DataView dvCurrentCodeValues = dtChargeCodeValidValues.Copy().DefaultView;
      cmb.ItemsSource = dvCurrentCodeValues;
      cmb.DisplayMemberPath = "Description";
      cmb.SelectedValuePath = "Description";
      cmb.SelectedValue = "Description";
 }

【问题讨论】:

标签: c# wpf xaml binding combobox


【解决方案1】:

没有什么魔法可以在您的应用程序的不同调用中保持ComboBox 中的选择;您必须自己编写代码。例如:

<ComboBox
    x:Name="comboBox"
    SelectionChanged="OnSelectionChanged"
    Loaded="OnComboBoxLoaded"
    >
    <ComboBox.Items>
        <system:String>One</system:String>
        <system:String>Two</system:String>
        <system:String>Three</system:String>
    </ComboBox.Items>
</ComboBox>

...使用以下代码隐藏:

private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    int index = comboBox.SelectedIndex;
    using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
    {
        using (IsolatedStorageFileStream stream = store.CreateFile("selectedIndex"))
        {
            using (BinaryWriter writer = new BinaryWriter(stream))
            {
                writer.Write(index.ToString());
            }
        }
    }
}

private void OnComboBoxLoaded(object sender, RoutedEventArgs e)
{
    int index = GetPreviousIndex();
    comboBox.SelectedIndex = index;
    comboBox.Text = comboBox.Items[index] as string;
}

private int GetPreviousIndex()
{
    using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
    {
        using (IsolatedStorageFileStream stream = store.OpenFile("selectedIndex", FileMode.Open))
        {
            using (BinaryReader reader = new BinaryReader(stream))
            {
                try
                {
                    return int.Parse(reader.ReadString());
                }
                catch (Exception x)
                {
                    return -1;
                }
            }
        }
    }
}

注意设置SelectedIndex是不够的;您还必须设置Text 属性,否则如果不打开ComboBox,您将看不到选择。

当然,有很多方法可以保持选择;在这里,我只是快速(而且有点肮脏)拼凑了一些东西。

【讨论】:

  • 感谢您的关注。但是提供的逻辑不起作用,我需要从数据库中填充组合框值
  • 我向您保证,代码确实有效;我已经测试过了。我意识到您需要从数据库中填充ComboBox - 将选择设置为其保存值的适当位置将在那之后。我对你的cboCombo_Loaded 方法的最后三行有点好奇——这三个属性都设置为“描述”是什么意思?当您退出程序或更改选择时,您会在任何地方进行记录吗?
  • 我想以字符串的形式保存组合框文本。我这样做是因为此列默认为文本。我有 selectionchanged 事件,它在我选择和保存时工作正常。当我重新运行应用程序时,组合框中的选定项目/文本为空,但填充值
  • 使用SelectedValue 代替SelectedIndex 很好。你是否也设置了ComboBox.Text 属性?
  • 我也使用了 combobbox.text 属性,但没有任何区别。
猜你喜欢
  • 2011-06-06
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多