C#WPF的问题:无法初始化ComboBox中选定值正确

问题描述:

我的代码试图为自己的数据结构的对象列表创建动态组合框。每个对象都包含一个值列表,这些值将作为其项目填充到组合框中。该对象还包含一个名为'SelectedValue'的值。我希望每个组合框默认显示“SelectedValue”。但这不起作用。每次显示视图后,每个组合框只显示其第一项作为选定值。C#WPF的问题:无法初始化ComboBox中选定值正确

这是我的XAML代码:

<Window x:Class="WpfApplication2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <ListView ItemsSource="{Binding ViewItemList}" SelectionMode="Single" SelectedItem="{Binding Path=SelectedList}" HorizontalAlignment="Left" Height="218" Margin="44,30,0,0" VerticalAlignment="Top" Width="377"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn > 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <ComboBox ItemsSource="{Binding ComboBoxItemList, Mode=OneWay}" SelectedValue="{Binding SelectedValue, Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Margin="5,0" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 
    </ListView> 
</Grid> 

这是后面的代码:

public class ComboboxViewModel : DependencyObject 
{ 
    private ObservableCollection<ComboBoxItemsList> m_viewItemlist; 
    public ObservableCollection<ComboBoxItemsList> ViewItemList 
    { 
     get 
     { 
      return m_viewItemlist; 
     } 
     set 
     { 
      m_viewItemlist = value; 
     } 
    } 

    private ComboBoxItemsList m_selectedList; 
    public ComboBoxItemsList SelectedList 
    { 
     get 
     { 
      return m_selectedList; 
     } 
     set 
     { 
      m_selectedList = value; 
     } 
    } 

    public ComboboxViewModel(List<ComboBoxItemsList> ml) 
    { 
     m_viewItemlist = new ObservableCollection<ComboBoxItemsList>(); 
     foreach (ComboBoxItemsList item in ml) 
     { 
      m_viewItemlist.Add(item); 
     } 
     this.m_selectedList = ml[0]; 
    } 
} 

//a class to hold data structure to be shown in one combobox 
public class ComboBoxItemsList : DependencyObject 
{ 
    private List<string> m_comboBoxItemList; 
    public List<string> ComboBoxItemList 
    { 
     get { return m_comboBoxItemList; } 
    } 

    private string m_selectedValue; 
    public string SelectedValue 
    { 
     get { return (string)GetValue(SelectedItemProperty); } 
     set 
     { 
      SetValue(SelectedItemProperty, (string)value); 
     } 
    } 

    public static readonly DependencyProperty SelectedItemProperty = 
     DependencyProperty.Register("SelectedValue", typeof(string), typeof(ComboBoxItemsList), 
     new PropertyMetadata(OnSelectedValueChanged)); 

    private static void OnSelectedValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ComboBoxItemsList curModInfo = d as ComboBoxItemsList; 
     if (curModInfo != null) 
     { 
      string oldVersion = e.OldValue as string; 
      string newVersion = e.NewValue as string; 
      curModInfo.SelectedValueChanged(oldVersion, newVersion); 
     } 
    } 

    private void SelectedValueChanged(string oldValue, string newValue) 
    { 
     m_selectedValue = newValue; 
    } 

    public ComboBoxItemsList(List<string> list, string defaultVal) 
    { 
     m_comboBoxItemList = list; 
     m_selectedValue = defaultVal; 
    } 
} 


//This is main window to start the program 
public MainWindow() 
    { 
     InitializeComponent(); 

     List<ComboBoxItemsList> mm = new List<ComboBoxItemsList>(); 
     List<string> nums = new List<string>(); 
     nums.Add("1"); 
     nums.Add("2"); 
     nums.Add("3"); 
     ComboBoxItemsList m1 = new ComboBoxItemsList(nums, "2"); 
     mm.Add(m1); 
     List<string> letters = new List<string>(); 
     letters.Add("a"); 
     letters.Add("b"); 
     letters.Add("c"); 
     ComboBoxItemsList m2 = new ComboBoxItemsList(letters, "b"); 
     mm.Add(m2); 
     ComboboxViewModel vm = new ComboboxViewModel(mm); 
     this.DataContext = vm; 
    } 

你的代码看起来不错。你只需要删除IsSynchronizedWithCurrentItem =“真”或让它在你看来并取得了ComboBoxItemsList

public ComboBoxItemsList(List<string> list, string defaultVal) 
      { 
       m_comboBoxItemList = list; 
       SelectedValue = defaultVal; 
      } 
+0

感谢维杰构造的变化,你的建议工程:) – Ansonhy

+0

如果它的工作再请了 - 投票并接受答案 –

+0

完成,对延迟抱歉。我只是想出了如何接受它作为答案:)。 – Ansonhy