Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF绑定错误_C#_Wpf_Xaml - Fatal编程技术网

C# WPF绑定错误

C# WPF绑定错误,c#,wpf,xaml,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

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

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();
    }
}
通过这段代码,我得到:

无法创建默认转换器以执行“单向”转换 类型之间 'System.Collections.ObjectModel.ObservableCollection!1[Computabajo.Filtro]' 和“System.Windows.Data.BindingGroup”。考虑使用转换器 绑定的属性。BindingExpression:Path=filters; DataItem='MainWindow\u ViewModel'(HashCode=38845522);目标元素是 '列表框'(名称='');目标属性为“ItemBindingGroup”(类型 '绑定组')

PS:更改为
itemsource
,但现在我得到:

无法使用绑定检索值,并且没有有效的回退值 存在;改为使用默认值


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

...
使用:


相反:

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

在主窗口中\u视图模型:

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"));
}
public-observeCollection过滤器{get;}
公共主窗口_ViewModel()
{
Filtros=新的可观察集合();
添加(新过滤器(“tipo1”、“tag1”、“url1”);
添加(新过滤器(“tipo2”、“tag2”、“url2”);
添加(新过滤器(“tipo3”、“tag3”、“url3”);
添加(新过滤器(“tipo4”、“tag4”、“url4”);
添加(新过滤器(“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中的
DisplayMemberPath
属性来指示源对象的路径。但是,绑定不适用于字段,因此我必须更改
Filtro
并添加属性

此代码修复了所有问题:

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

谢谢大家的友好回答。

ItemsSource={Binding filters}
not
itemsbindinggroup
要填充列表框项目,请使用
ItemsSource
代替
itemsbindinggroup
您没有设置数据上下文,请执行此操作。datacontext=new main window\u ViewModel();您的Filtro构造函数正在做它应该做的事情吗?据我所见,你正在创建5个没有数据的过滤器。是的,很抱歉那里有一个bug。谢谢但是,我不应该有“无法使用绑定检索值,并且不存在有效的回退值;请改用默认值”
<Window.DataContext>
    <local:MainWindow_ViewModel />
</Window.DataContext>
<Grid>
    <ListBox MinHeight="100" ItemsSource="{Binding Filtros}" />
</Grid>
<ListBox MinHeight="100" DisplayMemberPath="tag" MaxHeight="200">
    <ListBox.ItemsSource>
        <Binding Path="filtros"></Binding>
    </ListBox.ItemsSource>
</ListBox>
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;
    }

}