WPF在ComboBox中选择值 [英] WPF selected value in ComboBox

查看:229
本文介绍了WPF在ComboBox中选择值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在DataGrid视图中遇到了ComboBox。



我有2个可观察的集合。一个用于数据网格,其中列DDV显示组合框的选定项,第二个为CombBox的所有选项。



可观察的集合DDV_Data(所有ComboBox选项)在ArtikliStoritveData的Observable集合中。



我的WPF看起来像这样:

 < DataGrid ItemsSource ={Binding Path = ArtikliStoritveData}AutoGenerateColumns =FalseSelectionMode =SingleCanUserAddRows = Truex:Name =dgArtikliStoritveHorizo​​ntalAlignment =LeftMargin =31,58,0,0VerticalAlignment =TopHeight =229Width =612> 
< DataGrid.Columns>
< DataGridTextColumn Header =ŠifraBinding ={Binding Sifra}/>
< DataGridTextColumn Header =NazivBinding ={Binding Naziv}Width =200/>
< DataGridTextColumn Header =ZnesekBinding ={local:CultureAwareBinding Path = Znesek,StringFormat = {} {0:C}}/>
< DataGridTextColumn Header =DDVBinding ={local:CultureAwareBinding Path = DDV}/>
< DataGridTextColumn Header =EMBinding ={Binding EM}/>
< DataGridTextColumn Header =Datum spremembeBinding ={local:CultureAwareBinding Path = DatumSpremembe}/>
< DataGridTemplateColumn Header =DDV>
< DataGridTemplateColumn.CellTemplate>
< DataTemplate>
< ComboBox
x:Name =cmbDDV
ItemsSource ={Binding DDV_Data}
SelectedValuePath =DDV
DisplayMemberPath =DDV
SelectedValue ={Binding DDV1}
IsSynchronizedWithCurrentItem =True
宽度=50
/>
< / DataTemplate>
< /DataGridTemplateColumn.CellTemplate>
< / DataGridTemplateColumn>
< DataGridTextColumn Binding ={Binding Artikel_ID}Width =0Visibility =Hidden/>
< DataGridTextColumn Binding ={Binding SkupinaArtikla}Width =0Visibility =Hidden/>
< /DataGrid.Columns>
< / DataGrid>

我在DataGrid中的结果是:





很明显所选项目不工作。我在做什么错?



我也想知道为什么新行中的ComboBox不会绑定?



DDV_Data是Observable Collection的一部分,它被绑定到DataGrid:

  ArtikliStoritveData.Add(new ArtikliStoritve 
{
Artikel_ID = Convert.ToInt32(dt.Rows [i] [artikel_id] ToString()),
SkupinaArtikla = Convert.ToInt32(dt.Rows [i] [skupina_artikla] ToString )),
Sifra = dt.Rows [i] [sifra] ToString(),
EM = dt.Rows [i] [em] ToString(),
Naziv = dt.Rows [i] [naziv] ToString(),
DDV = Convert.ToDecimal(dt.Rows [i] [ddv]。ToString()),
DDV_Data = DDV_Data1,
SelectedItem =22.0,
Znesek = Decimal.Parse(dt.Rows [i] [znesek] ToString()),
DatumSpremembe = DateTime .Parse(dt.Rows [i] [date_changed]。ToString())
});

在ArtikliStoritve模型中的DDV属性:

  public decimal DDV 
{
get {return _ddv; }
set {_ddv = value;我还注意到,当我改变ComboBox中的值时,每一行都有变化?





ArtikliStoritve:

  class ArtikliStoritve 
{

#region private varaibles
int _artikel_id;
int _skupinaArtikla;
string _sifra;
string _naziv;
string _EM;
十进制_ddv;
十进制_znesek;
DateTime _datum_spremembe;

#endregion

#region属性
public int Artikel_ID
{
get {return _artikel_id; }
set {_artikel_id = value; }
}

public int SkupinaArtikla
{
get {return _skupinaArtikla; }
set {_skupinaArtikla = value; }
}

public string Sifra
{
get {return _sifra; }
set {_sifra = value; }
}

public string EM
{
get {return _EM; }
set {_EM = value; }
}

public string Naziv
{
get {return _naziv; }
set {_naziv = value; }
}

public decimal DDV1
{
get {return _ddv; }
set {_ddv = value; }
}

public decimal Znesek
{
get {return _znesek;}
set {_znesek = value; }
}

public DateTime DatumSpremembe
{
get {return _datum_spremembe; }
set {_datum_spremembe = value; }
}

private decimal _SelectedItem;
public decimal SelectedItem
{
get {return _SelectedItem; }
set {_SelectedItem = value; }
}

private ObservableCollection< DDV_Class> _DDV_Data = new ObservableCollection< DDV_Class>();
public ObservableCollection< DDV_Class> DDV_Data
{
get {return _DDV_Data; }
set {_DDV_Data = value; }
}
#endregion
}

对于ComboBox我有一个类:

  class DDV_Class 
{
private int _ID;
public int ID
{
get {return _ID; }
set {_ID = value; }
}

私有十进制_DDV;
public decimal DDV
{
get {return _DDV; }
set {_DDV = value; }
}
}

我填写ArtikliStoritveViewModel:

(int i = 0; i< dtDDV.Rows.Count; i ++)
{
DDV_Data1.Add (新的DDV_Class
{
ID = Convert.ToInt32(dtDDV.Rows [i] [ID]。ToString()),
DDV = Convert.ToDecimal(dtDDV.Rows ] [DDV]。ToString())
});
}

- >更新



我做了什么在ArtikliStoritve中:

  private DDV_Class _SelectedItem; 
public DDV_Class SelectedItem
{
get {return _SelectedItem; }
set {_SelectedItem = value;
}

填写时:



(int i = 0; i {
ArtikliStoritveData.Add(new ArtikliStoritve
{
Artikel_ID = Convert.ToInt32(dt.Rows [i] [artikel_id]。ToString()),
SkupinaArtikla = Convert.ToInt32(dt.Rows [i] [skupina_artikla] ToString(),
Sifra = dt.Rows [i] [sifra] ToString(),
EM = dt.Rows [i] [em] ToString()
Naziv = dt.Rows [i] [naziv] ToString(),
DDV1 = Convert.ToDecimal(dt.Rows [i] [ddv] ToString()),
DDV_Data = DDV_Data1,
SelectedItem = new DDV_Class {ID = 1,DDV = 22.0m},
Znesek = Decimal.Parse(dt.Rows [i] [znesek] ToString )),
DatumSpremembe = DateTime.Parse(dt.Rows [i] [date_changed]。ToString())
});
}

在ArtikliStoritveModelView中我也有属性:

  public DDV_Class SelectedItem 
{
get {return ArtikliStoritve.SelectedItem; }
set {ArtikliStoritve.SelectedItem = value; OnPropertyChanged(SelectedItem);
}

WPF如下所示:

 < DataTemplate> 
< ComboBox
x:Name =cmbDDV
ItemsSource ={Binding DDV_Data}
DisplayMemberPath =DDV
SelectedItem ={Binding Path = SelectedItem $
IsSynchronizedWithCurrentItem =True
宽度=50
/>
< / DataTemplate>

结果与上图中显示的相同。



- > UPDATE
我想出来,为什么在一行中更改comboBox中的值时,为什么所有行中的值都会更改。问题vas beacuse我在每行中添加了一个可观察集合:



DDV_Data1不是为每行执行实例,所以这是一个问题 - 所有行中的一个对象: / p>

  DataTable dtDDV = myDDV_DAL.getAll(); 
if(dtDDV.Rows.Count> 0)
{
for(int i = 0; i< dtDDV.Rows.Count; i ++)
{
DDV_Data1.Add(new DDV_Class
{
ID = Convert.ToInt32(dtDDV.Rows [i] [ID]。ToString()),
DDV = Convert.ToDecimal(dtDDV .Rows [i] [DDV]。ToString())
});
}
}

ArtikliStoritveDAL myArtikliStoritveDAL = new ArtikliStoritveDAL();
DataTable dt = myArtikliStoritveDAL.getAll();
if(dt.Rows.Count> 0)
{
for(int i = 0; i {
ArtikliStoritveData.Add(new ArtikliStoritve
{
...
DDV_Data = DDV_Data1,
...

我在另一个专栏上进行了测试:

  EM_DAL myEM_DAL = new EM_DAL(); 
DataTable dtEM = myEM_DAL.getAll();
if(dtEM.Rows.Count> 0)
{
for i = 0; i {
EM_Data.Add(new EM_Model
{
ID = dtEM.Rows [i] [EM ] .ToString(),
Naziv = dtEM.Rows [i] [EM]。ToString()
});
}
}

ArtikliStoritveDAL myArtikliStoritveDAL = new ArtikliStoritveDAL();
DataTable dt = myArtikliStoritveDAL.getAll();
if(dt.Rows.Count> 0)
{
for int i = 0; i {
ArtikliStoritveData.Add(new ArtikliStoritve
{
...
EM_Data = getAll(dt.Rows [i] [em]。ToString()),
...


公开列表< EM_Model> getAll(string p_selected)
{
列表< EM_Model> myEM_Model = new List< EM_Model>();
string strConnString = Util.getConnectionString();
try
{
NpgsqlConnection conn = new NpgsqlConnection(strConnString);
DataTable dt = new DataTable();
conn.Open();
NpgsqlDataAdapter da = new NpgsqlDataAdapter(SELECT em,em
+FROM em,conn);
da.Fill(dt);
conn.Close(); (int i = 0; i< dt.Rows.Count; i ++)
{
myEM_Model.Add(new EM_Model
{
ID = dt。行[i] [EM]。ToString(),
Naziv = dt.Rows [i] [EM] ToString(),
SelectedItem1 = p_selected
});
}
return myEM_Model;

现在我必须弄清楚为什么没有在comboBox中选择值。我使用在对象中创建的所选值进行测试,其中comboBox的所有选项都是(getAll())或集合ArtikliStoritveData。两个人都没有工作。



继续搜索正确的解决方案...:)



如果我在一行中删除contect,Snoop显示我这个(这是正确的):





如果在WPF中这样做,Combobox中的选定值是列表中的第一个值,而不是正确的值:

 < ComboBox 
x:Name =cmbEM
ItemsSource ={Binding EM_Data}
DisplayMemberPath =Naziv
SelectedItem ={Binding EM}
IsSynchronizedWithCurrentItem =True
宽度=50
/>

最后我找到了一个解决方案。调整SelectedValue和SelectedValuePath做了一个难题。

 < ComboBox 
x:Name =cmbDDV
ItemsSource ={Binding DDV_Data}
DisplayMemberPath =DDV
SelectedValue ={Binding DDV,Mode = TwoWay}
SelectedValuePath =DDV
IsSynchronizedWithCurrentItem =True
宽度=50
/>

链接我发现了有助于我的其他信息。



Regards,
Igor

解决方案

我想我可以看到你的错误是...当数据绑定到一个 ComboBox.SelectedItem 属性,有几件事要注意。第一个是绑定到 SelectedItem 属性的对象数据必须是与集合中的数据相同的类型,该数据绑定到 ItemsSource 属性。



从您的代码中,您似乎将数据绑定到 ItemsSource 属性的集合类似于一个自定义类...您没有显示,但我猜是因为您将 DisplayMemberPath 设置为值 Naziv 。因此,您需要将您的数据绑定到 SelectedItem 属性的 DDV 属性与或者您可以尝试使用 ComboBox.SelectedValue 属性与 SelectedValuePath 属性结合使用:

 < ComboBox x:Name =cmbDDV
ItemsSource ={Binding Path = DDV_Data}
DisplayMemberPath =Naziv
SelectedValuePath =Naziv
IsSynchronizedWithCurrentItem =True
SelectedValue ={Binding Path = DDV}
Width =50/>






更新>>>



您最新的编辑是不是我建议的。所有这一切,现在你已经添加了相关的代码,我可以看到, ArtikliStoritveData 是一种类型 ArtikliStoritve DDV_Data 是该类中的一个属性,它是 DDV_Class 的集合。因此,您可以在 ArtikliStoritve 类中的类型为 DDV_Class 的属性,您可以绑定到 SelectedIten 属性:

 < ComboBox x:Name =cmbDDV
ItemSource ={Binding Path = DDV_Data}
SelectedItem ={Binding Path = SelectedItem}
IsSynchronizedWithCurrentItem =True
Width =50/>

...

private DDV_Class _SelectedItem;
public DDV_Class SelectedItem
{
get {return _SelectedItem; }
set {_SelectedItem = value; }
}

private ObservableCollection< DDV_Class> _DDV_Data = new ObservableCollection< DDV_Class>();
public ObservableCollection< DDV_Class> DDV_Data
{
get {return _DDV_Data; }
set {_DDV_Data = value; }
}

只需几个注意事项,以备将来... if您要从代码中设置 ComboBox.SelectedItem ,您设置为值的项目必须是集合中的实际项目,即绑定到 ComboBox.ItemsSource 属性。你可以这样做:

  SelectedItem = DDV_Data.Where(d => d.ID == someIdValue)。 (); 

此外,您应该在Visual Studio中的输出窗口中显示一些错误... :


System.Windows.Data错误:40:BindingExpression路径错误:'object'''NameOfDataBoundObject' (Name ='')'。 BindingExpression:Path = SomePath; DataItem ='NameOfDataBoundObject'(Name ='');目标元素为'TypeOfUiElement'(Name ='NameOfUiElement');目标属性是PropertyName(类型'TypeOfProperty')


这些都是有价值的线索...注意他们,因为他们帮助您追踪您的问题。


I'am struggling with ComboBox in my DataGrid View.

I have 2 Observable Collection. One for Data Grid where column DDV presents selected item of Combobox and second where are all options for CombBox.

Observable Collection DDV_Data (all ComboBox options) is in Observable Collection of ArtikliStoritveData.

My WPF looks like this:

        <DataGrid ItemsSource="{Binding Path=ArtikliStoritveData}" AutoGenerateColumns="False" SelectionMode="Single" CanUserAddRows="True" x:Name="dgArtikliStoritve" HorizontalAlignment="Left" Margin="31,58,0,0" VerticalAlignment="Top" Height="229" Width="612">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Šifra" Binding="{Binding Sifra}" />
            <DataGridTextColumn Header="Naziv" Binding="{Binding Naziv}" Width="200"/>
            <DataGridTextColumn Header="Znesek" Binding="{local:CultureAwareBinding Path=Znesek, StringFormat={}{0:C}}"/>
            <DataGridTextColumn Header="DDV" Binding="{local:CultureAwareBinding Path=DDV}" />
            <DataGridTextColumn Header="EM" Binding="{Binding EM}" />
            <DataGridTextColumn Header="Datum spremembe" Binding="{local:CultureAwareBinding Path=DatumSpremembe}" />
            <DataGridTemplateColumn Header="DDV">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox
                            x:Name="cmbDDV"
                            ItemsSource="{Binding DDV_Data}"
                            SelectedValuePath="DDV"
                            DisplayMemberPath="DDV"
                            SelectedValue="{Binding DDV1}"
                            IsSynchronizedWithCurrentItem="True"
                            Width="50"
                        />
                        </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Binding="{Binding Artikel_ID}" Width="0" Visibility="Hidden"/>
            <DataGridTextColumn Binding="{Binding SkupinaArtikla}" Width="0" Visibility="Hidden"/>
        </DataGrid.Columns>
    </DataGrid>

And my result in DataGrid is:

It is obvious that selected item is not working. What I'am doing wrong?

I am also wondering why ComboBox in new row doesn't get bind?

DDV_Data is part of Observable Collection which is binded to DataGrid:

                ArtikliStoritveData.Add(new ArtikliStoritve
                {    
                    Artikel_ID = Convert.ToInt32(dt.Rows[i]["artikel_id"].ToString()),
                    SkupinaArtikla = Convert.ToInt32(dt.Rows[i]["skupina_artikla"].ToString()),
                    Sifra = dt.Rows[i]["sifra"].ToString(),
                    EM = dt.Rows[i]["em"].ToString(),
                    Naziv = dt.Rows[i]["naziv"].ToString(),
                    DDV = Convert.ToDecimal(dt.Rows[i]["ddv"].ToString()),
                    DDV_Data = DDV_Data1,
                    SelectedItem = "22.0",
                    Znesek = Decimal.Parse(dt.Rows[i]["znesek"].ToString()) ,
                    DatumSpremembe = DateTime.Parse(dt.Rows[i]["date_changed"].ToString())
                });    

DDV Property in ArtikliStoritve model:

    public decimal DDV
    {
        get { return _ddv; }
        set { _ddv = value; }

I have also noticed that when I change value in ComboBox ith changes in every row???

ArtikliStoritve:

class ArtikliStoritve
{

    #region private varaibles
    int _artikel_id;
    int _skupinaArtikla;
    string _sifra;
    string _naziv;
    string _EM;
    decimal _ddv;
    decimal _znesek;
    DateTime _datum_spremembe;

    #endregion

    #region properties
    public int Artikel_ID
    {
        get { return _artikel_id; }
        set { _artikel_id = value; }
    }

    public int SkupinaArtikla
    {
        get { return _skupinaArtikla; }
        set { _skupinaArtikla = value; }
    }

    public string Sifra
    {
        get { return _sifra; }
        set { _sifra = value; }
    }

    public string EM
    {
        get { return _EM; }
        set { _EM = value; }
    }

    public string Naziv
    {
        get { return _naziv; }
        set { _naziv = value; }
    }

    public decimal DDV1
    {
        get { return _ddv; }
        set { _ddv = value; }
    }

    public decimal Znesek
    {
        get { return _znesek;}
        set { _znesek = value; }
    }

    public DateTime DatumSpremembe
    {
        get { return _datum_spremembe; }
        set { _datum_spremembe = value; }
    }

    private decimal _SelectedItem;
    public decimal SelectedItem
    {
        get { return _SelectedItem; }
        set { _SelectedItem = value; }
    }

    private ObservableCollection<DDV_Class> _DDV_Data = new ObservableCollection<DDV_Class>();
    public ObservableCollection<DDV_Class> DDV_Data
    {
        get { return _DDV_Data; }
        set { _DDV_Data = value; }
    }
    #endregion
}

For ComboBox I have a class:

class DDV_Class
{
    private int _ID;
    public int ID
    {
        get { return _ID; }
        set { _ID = value; }
    }

    private decimal _DDV;
    public decimal DDV
    {
        get { return _DDV; }
        set { _DDV = value; }
    }
}

which i Fill in ArtikliStoritveViewModel:

for (int i = 0; i < dtDDV.Rows.Count; i++)
{
    DDV_Data1.Add(new DDV_Class
    {
        ID = Convert.ToInt32(dtDDV.Rows[i]["ID"].ToString()),
        DDV = Convert.ToDecimal(dtDDV.Rows[i]["DDV"].ToString())
    });
}

--> UPDATE

What I did. In ArtikliStoritve:

private DDV_Class _SelectedItem;
public DDV_Class SelectedItem
{
    get { return _SelectedItem; }
    set { _SelectedItem = value; }
}

When filling:

for (int i = 0; i < dt.Rows.Count; ++i)
{
    ArtikliStoritveData.Add(new ArtikliStoritve
    {
        Artikel_ID = Convert.ToInt32(dt.Rows[i]["artikel_id"].ToString()),
        SkupinaArtikla = Convert.ToInt32(dt.Rows[i]["skupina_artikla"].ToString()),
        Sifra = dt.Rows[i]["sifra"].ToString(),
        EM = dt.Rows[i]["em"].ToString(),
        Naziv = dt.Rows[i]["naziv"].ToString(),
        DDV1 = Convert.ToDecimal(dt.Rows[i]["ddv"].ToString()),
        DDV_Data = DDV_Data1,
        SelectedItem = new DDV_Class { ID = 1, DDV = 22.0m },
        Znesek = Decimal.Parse(dt.Rows[i]["znesek"].ToString()),
        DatumSpremembe = DateTime.Parse(dt.Rows[i]["date_changed"].ToString())
    });        
}

In ArtikliStoritveModelView I also have property:

public DDV_Class SelectedItem
{
    get { return ArtikliStoritve.SelectedItem; }
    set { ArtikliStoritve.SelectedItem = value; OnPropertyChanged("SelectedItem"); }
}

WPF look like this:

<DataTemplate>
    <ComboBox
        x:Name="cmbDDV"
        ItemsSource="{Binding DDV_Data}"
        DisplayMemberPath="DDV"
        SelectedItem="{Binding Path=SelectedItem}"
        IsSynchronizedWithCurrentItem="True"
        Width="50"
    />
</DataTemplate>

Result is same like picture above is showing.

--> UPDATE I figure it out why value in all rows changed when I change value in comboBox in one row. Problem vas beacuse I added in each row one istance of Observable Collection:

DDV_Data1 is not instantiate for each row, so this is a problem - one object in all rows:

DataTable dtDDV = myDDV_DAL.getAll();
if (dtDDV.Rows.Count > 0)
{
    for (int i = 0; i < dtDDV.Rows.Count; i++)
    {
        DDV_Data1.Add(new DDV_Class
        {
            ID = Convert.ToInt32(dtDDV.Rows[i]["ID"].ToString()),
            DDV = Convert.ToDecimal(dtDDV.Rows[i]["DDV"].ToString())
        });
    }
}

ArtikliStoritveDAL myArtikliStoritveDAL  = new ArtikliStoritveDAL();
DataTable dt = myArtikliStoritveDAL.getAll();
if (dt.Rows.Count > 0)
{
    for (int i = 0; i < dt.Rows.Count; ++i)
    {
        ArtikliStoritveData.Add(new ArtikliStoritve
        {
            ...
            DDV_Data = DDV_Data1,
            ...

I did my testing on another column where this is now working:

EM_DAL myEM_DAL = new EM_DAL();
DataTable dtEM = myEM_DAL.getAll();
if (dtEM.Rows.Count > 0)
{
    for (int i = 0; i < dtEM.Rows.Count; i++)
    {
        EM_Data.Add(new EM_Model
        {
            ID = dtEM.Rows[i]["EM"].ToString(),
            Naziv = dtEM.Rows[i]["EM"].ToString()
        });
    }
}

    ArtikliStoritveDAL myArtikliStoritveDAL  = new ArtikliStoritveDAL();
DataTable dt = myArtikliStoritveDAL.getAll();
if (dt.Rows.Count > 0)
{
    for (int i = 0; i < dt.Rows.Count; ++i)
    {
        ArtikliStoritveData.Add(new ArtikliStoritve
        {
            ...
            EM_Data = getAll(dt.Rows[i]["em"].ToString()),
            ...


public List<EM_Model> getAll(string p_selected)
{
    List<EM_Model> myEM_Model = new List<EM_Model>();
    string strConnString = Util.getConnectionString();
    try
    {
        NpgsqlConnection conn = new NpgsqlConnection(strConnString);
        DataTable dt = new DataTable();
        conn.Open();
        NpgsqlDataAdapter da = new NpgsqlDataAdapter("SELECT em, em "
                                                        + " FROM em", conn);
        da.Fill(dt);
        conn.Close();
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            myEM_Model.Add(new EM_Model
            {
                ID = dt.Rows[i]["EM"].ToString(),
                Naziv = dt.Rows[i]["EM"].ToString(),
                SelectedItem1 = p_selected
            });
        }
        return myEM_Model;

Now I must figure it out why is value is not getting selected in comboBox. I tested with selected value created in object where all options for comboBox is (getAll()) or in collection ArtikliStoritveData. Neither one is working.

Keep searching for right solution... :)

If I serach contect in one row, Snoop showing me this(which is right):

If do this in WPF, selected value in Combobox is first value in list, not the correct one:

<ComboBox
    x:Name="cmbEM"
    ItemsSource="{Binding EM_Data}"
    DisplayMemberPath="Naziv"
    SelectedItem="{Binding EM}"
    IsSynchronizedWithCurrentItem="True"
    Width="50"
/>

And finally I found a solution. Conjuction of SelectedValue and SelectedValuePath did the trick.

<ComboBox
    x:Name="cmbDDV"
    ItemsSource="{Binding DDV_Data}"
    DisplayMemberPath="DDV"
    SelectedValue="{Binding DDV, Mode=TwoWay}" 
    SelectedValuePath="DDV" 
    IsSynchronizedWithCurrentItem="True"
    Width="50"
/>

On the link I found additional informations which helped me.

Regards, Igor

解决方案

I think I can see where your error is... when data binding to a ComboBox.SelectedItem property, there are a few things to note. The first is that the object data bound to the SelectedItem property must be of the same type as the items in the collection that is data bound to the ItemsSource property.

From your code, it seems as though the collection you data bound to the ItemsSource property was of the type of a custom class... you didn't show that, but I guessed because you set the DisplayMemberPath to a value of Naziv. So either you'd need to make your DDV property that you data bind to the SelectedItem property the same type as the items in the collection , or you could try using the ComboBox.SelectedValue property in conjunction with the SelectedValuePath property instead:

<ComboBox x:Name="cmbDDV" 
    ItemsSource="{Binding Path=DDV_Data}"
    DisplayMemberPath="Naziv"
    SelectedValuePath="Naziv"
    IsSynchronizedWithCurrentItem="True"
    SelectedValue="{Binding Path=DDV}"
    Width="50" />


UPDATE >>>

Your latest edit is not what I suggested. All the same, now that you've added the relevant code, I can see that ArtikliStoritveData is a collection of type ArtikliStoritve and DDV_Data is a property in that class which is a collection of type DDV_Class. Therefore, you need a property also of type DDV_Class in your ArtikliStoritve class that you can bind to the SelectedIten property:

<ComboBox x:Name="cmbDDV" 
    ItemsSource="{Binding Path=DDV_Data}"
    SelectedItem="{Binding Path=SelectedItem}"
    IsSynchronizedWithCurrentItem="True"
    Width="50" />

...

private DDV_Class _SelectedItem;
public DDV_Class SelectedItem
{
    get { return _SelectedItem; }
    set { _SelectedItem = value; }
}

private ObservableCollection<DDV_Class> _DDV_Data = new ObservableCollection<DDV_Class>();
public ObservableCollection<DDV_Class> DDV_Data
{
    get { return _DDV_Data; }
    set { _DDV_Data = value; }
}

Just a couple of things to note here for the future... if you want to set the ComboBox.SelectedItem from the code, the item that you set as the value must be an actual item from the collection that is bound to the ComboBox.ItemsSource property. You can do it like this:

SelectedItem = DDV_Data.Where(d => d.ID == someIdValue).Single();

Also, you should have got some errors displayed in the Output Window in Visual Studio... something like:

System.Windows.Data Error: 40 : BindingExpression path error: 'Some' property not found on 'object' ''NameOfDataBoundObject' (Name='')'. BindingExpression:Path=SomePath; DataItem='NameOfDataBoundObject' (Name=''); target element is 'TypeOfUiElement' (Name='NameOfUiElement'); target property is 'PropertyName' (type 'TypeOfProperty')

These are all valuable clues... pay attention to them, because they help you track down your problems.

这篇关于WPF在ComboBox中选择值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆