WPF绑定错误

时间:2015-11-19 17:49:41

标签: c# wpf xaml

我真的不明白我在这里做错了什么。 这些是我的课程:

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'。考虑使用Converter   Binding的财产。 BindingExpression:路径=筛选现在;   DataItem ='MainWindow_ViewModel'(HashCode = 38845522);目标元素是   'ListBox'(Name =''); target属性是'ItemBindingGroup'(类型   'BindingGroup')

PS:改为ItemsSource,但现在我得到了:

  

无法使用绑定检索值,也没有有效的回退值   存在;使用默认值。

4 个答案:

答案 0 :(得分:3)

使用:

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

相反:

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

答案 1 :(得分:1)

您应该绑定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}">

答案 2 :(得分:0)

在您的MainWindow_ViewModel中:

goalReport.html

在XAML:

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

我看到这没有任何绑定错误:

enter image description here

我怀疑分配给提供者ObservableCollection而不是VM中的公共属性可能存在问题。使用自动属性,看看是否有帮助。

要查看每个Filtro中的实际数据,可以覆盖Filtro类中的ToString(),或者在ListBox的ItemTemplate中定义DataTemplate,并将数据绑定到Filtro类的字符串属性。

答案 3 :(得分:0)

我弄明白了这个问题。 第一个错误是我使用的是ItemBindingGroup,我应该使用ItemsSource

第二个问题是因为Filtro不是一个可识别的对象&#34; (在某种意义上它比简单的字符串或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;
    }

}

谢谢大家的回答。