簡體   English   中英

WPF綁定錯誤

[英]WPF Binding error

我真的不明白我在做什么錯。 這些是我的課程:

class Filtro
{
    public string url;
    public string tag;
    public string tipo;

    public Filtro(string _tipo, string _tag, string _url)
    {
        url = _url;
        tag = _tag;
        tipo = _tipo;
    }

}

class MainWindow_ViewModel
{
    private ObservableCollection<Filtro> _filtros;
    public ObservableCollection<Filtro> filtros
    {
        get
        {
            return _filtros;
        }
    }

    public MainWindow_ViewModel()
    {
        _filtros = new ObservableCollection<Filtro>();
        _filtros.Add(new Filtro("tipo1","tag1","url1"));
        _filtros.Add(new Filtro("tipo2","tag2","url2"));
        _filtros.Add(new Filtro("tipo3","tag3","url3"));
        _filtros.Add(new Filtro("tipo4","tag4","url4"));
        _filtros.Add(new Filtro("tipo5","tag5","url5"));
    }


}

public partial class MainWindow : Window
{
    static public MainWindow wn;
    private MainWindow_ViewModel mwvm;

    public MainWindow()
    {
        wn = this;
        mwvm = new MainWindow_ViewModel();
    }
}

我在XAML中有一個ListBox ,並且正在嘗試將其綁定到MainWindow.wn.mwvm.filtros (假設我想將其綁定到Filtro.url字段)。

<Window x:Class="computrabajo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:computrabajo"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:MainWindow_ViewModel></local:MainWindow_ViewModel>
    </Window.DataContext>
...
<ListBox MinHeight="100" ItemsSource="{Binding filtros}">

通過此代碼,我得到:

無法創建默認轉換器以在類型“ System.Collections.ObjectModel.ObservableCollection!1 [computrabajo.Filtro]”和“ System.Windows.Data.BindingGroup”之間執行“單向”轉換。 考慮使用Binding的Converter屬性。 BindingExpression:Path = filtros; DataItem ='MainWindow_ViewModel'(HashCode = 38845522); 目標元素是'ListBox'(Name =''); 目標屬性為“ ItemBindingGroup”(類型為“ BindingGroup”)

PS:更改為ItemsSource但現在我得到:

無法使用綁定檢索值,並且不存在有效的后備值; 使用默認值代替。

采用:

<ListBox MinHeight="100" ItemsSource="{Binding filtros}">

代替:

<ListBox MinHeight="100" ItemBindingGroup="{Binding filtros}">

您應該綁定ItemsSource而不是ItemsBindingGroup

<Window x:Class="computrabajo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:computrabajo"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:MainWindow_ViewModel></local:MainWindow_ViewModel>
    </Window.DataContext>
...
<ListBox MinHeight="100" ItemsSource="{Binding filtros}">

在您的MainWindow_ViewModel中:

public ObservableCollection<Filtro> Filtros { get; }

public MainWindow_ViewModel()
{
    Filtros = new ObservableCollection<Filtro>();
    Filtros.Add(new Filtro("tipo1", "tag1", "url1"));
    Filtros.Add(new Filtro("tipo2", "tag2", "url2"));
    Filtros.Add(new Filtro("tipo3", "tag3", "url3"));
    Filtros.Add(new Filtro("tipo4", "tag4", "url4"));
    Filtros.Add(new Filtro("tipo5", "tag5", "url5"));
}

在XAML中:

<Window.DataContext>
    <local:MainWindow_ViewModel />
</Window.DataContext>
<Grid>
    <ListBox MinHeight="100" ItemsSource="{Binding Filtros}" />
</Grid>

我看到這沒有任何綁定錯誤:

在此處輸入圖片說明

我懷疑分配給provate ObservableCollection而不是VM中的公共屬性時可能會出現問題。 使用自動屬性,看看是否有幫助。

若要查看每個Filtro中的實際數據,請重寫Filtro類中的ToString(),或在ListBox的ItemTemplate中定義一個DataTemplate,然后將其數據綁定到Filtro類中的字符串屬性。

我解決了這個問題。 第一個錯誤是我使用的是ItemBindingGroup ,應該使用ItemsSource

第二個問題是因為Filtro並不是“可識別的對象”(從某種意義上說,它比簡單的字符串或int更為復雜),因此WPF並不確切知道如何將其轉換為字符串以填充ListBox。

從這種意義上講,我應該使用ListBox中的DisplayMemberPath屬性來指示源對象的路徑。 但是,綁定不適用於Fields,因此我不得不更改Filtro並添加屬性。

這段代碼解決了所有問題:

<ListBox MinHeight="100" DisplayMemberPath="tag" MaxHeight="200">
    <ListBox.ItemsSource>
        <Binding Path="filtros"></Binding>
    </ListBox.ItemsSource>
</ListBox>

和Filtro類:

public class Filtro
{
    private string _url;
    public string url { get { return _url; } set { _url = value; } }

    private string _tag;
    public string tag { get { return _tag; } set { _tag = value; } }

    private string _tipo;
    public string tipo { get { return _tipo; } set { _tipo = value; } }

    public Filtro(string _tipo, string _tag, string _url)
    {
        url = _url;
        tag = _tag;
        tipo = _url;
    }

}

謝謝大家的友好回答。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM