简体   繁体   中英

C# WPF issue: cannot initialize a Combobox selected value correctly

My code is trying to dynamically create comboboxes for a list of objects of my own data structure. And each object contains a list of values which will be filled in the comboBox as its items. The object also contain a value named 'SelectedValue'. I want each combobox shows this 'SelectedValue' by default. But this does not work. Every time after the view is shown, each combobox just shows its first item as selected value.

This is my XAML code:

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

This are code behind:

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;
    }

your code looks good. you just need to remove IsSynchronizedWithCurrentItem="True" or make it false in your view and made the changes in constructor of ComboBoxItemsList

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM