2015-11-19 83 views
-1

我真的不明白我在這裏做錯了什麼。 這些都是我的課:WPF綁定錯誤

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:路徑=篩選現在; DataItem ='MainWindow_ViewModel'(HashCode = 38845522);目標元素是 'ListBox'(Name ='');目標屬性是「ItemBindingGroup」(類型 「BindingGroup」)

PS:改到ItemsSource,但現在我得到:

使用綁定和沒有有效的回退值 存在無法檢索值;改爲使用默認值。

+1

'的ItemsSource = {結合篩選現在}''不ItemBindingGroup' – Marshal

+0

填寫列表框項的'ItemBindingGroup' –

+0

您沒有設置的datacontext的地方使用'ItemsSource',做this.DataContext =新MainWindow_ViewModel(); –

回答

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}"> 
3

使用:

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

相反:

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

我的答案解決您的問題? –

0

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

我認爲這沒有任何約束力的錯誤:

enter image description here

我懷疑有可能是與公衆的分配給provate的ObservableCollection,而不是一個問題屬性在您的虛擬機。使用自動屬性,看看是否有幫助。

要查看每個Filtro中的實際數據,請覆蓋Filtro類中的ToString(),或者在ListBox的ItemTemplate中定義一個DataTemplate,並將數據綁定到Filtro類中的字符串屬性。

0

我想出了這個問題。 第一個錯誤是我正在使用ItemBindingGroup,我應該使用ItemsSource

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

從這個意義上說,我應該使用列表框中的DisplayMemberPath屬性來指示源對象的路徑。但是,綁定不適用於字段,因此我必須更改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; 
    } 

} 

謝謝大家對你的那種答案。