2014-02-10 70 views
-2

XAML:WPF綁定2列到ListView控件

<ListBox x:Name="MyTitleBox" ItemsSource="{Binding}"/> 
<ListBox x:Name="MyInfoBox" ItemsSource="{Binding}"/> 

在C#:

MyTitleBox.ItemsSource = new List<string>(new string[] {"ID:", "Info:", "More Info:"}); 
MyInfoBox.ItemsSource = new ObservableCollection<string>(MyMainInfo.ToString().Split(',').ToList<string>()); 

我現在有彼此相鄰的2個列表框中,因爲我需要以編程方式處理他們的ItemsSource。

我知道必須有更好的方法來合併兩者。實質上,「左側」列表框是類似ID的標題:「右側」列表框是信息。

我想我可以像MyTitleBox.Columns.Add那樣做,就像我見過的,但它不會讓我做.Columns。我使用.NET 4

+1

請閱讀'ItemTemplate'和'DataTemplate'。這[鏈接](http://wpftutorial.net/DataTemplates.html)會讓你開始。 –

+0

我有。我的問題是它需要在XAML中定義,而不是通過編程。 – user99999991

+0

這就是我所建議的。 ItemTemplate僅適用於XAML。 –

回答

0

這裏是一個更MVVM方法的例子:

域(類型,你希望把你的列表項):

public class Movie : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string _title; 

    public string Title 
    { 
     get { return _title; } 
     set 
     { 
      if (_title != value) 
      { 
       _title = value; 

       RaisePropertyChanged("Title"); 
      }     
     } 
    } 

    private string _info; 

    public string Info 
    { 
     get { return _info; } 
     set 
     { 
      if (_info != value) 
      { 
       _info = value; 

       RaisePropertyChanged("Info"); 
      }     
     } 
    } 

    protected void RaisePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

視圖模型:

public class MyViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private ObservableCollection<Movie> _movies; 

    /// <summary> 
    /// Collection of movies. 
    /// </summary> 
    public ObservableCollection<Movie> Movies 
    { 
     get { return _movies; } 
     set 
     { 
      if (_movies != value) 
      { 
       _movies = value; 

       RaisePropertyChanged("Movies"); 
      } 
     } 
    } 

    /// <summary> 
    /// Constructor 
    /// </summary> 
    public MyViewModel() 
    { 
     Movies = new ObservableCollection<Movie>(); 

     Movies.Add(new Movie() { Title = "Gravity", Info = "Gravity is about..." }); 
     Movies.Add(new Movie() { Title = "Avatar", Info = "Avatar is about..." }); 
    } 

    protected void RaisePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

XAML:

<Window x:Class="StackOverflow.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:StackOverflow" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <ListBox ItemsSource="{Binding Movies}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock> 
         <Run Text="{Binding Title}" /><Run Text=" - " /><Run Text="{Binding Info}" /> 
        </TextBlock> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

     <Button Grid.Row="1" Content="Click To Change Info" Margin="5" Click="Button_Click" /> 
    </Grid> 
</Window> 

代碼背後:

public partial class MainWindow : Window 
{ 
    public MyViewModel ViewModel { get; private set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 

     ViewModel = new MyViewModel(); 

     DataContext = ViewModel; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Movie movie = ViewModel.Movies.FirstOrDefault(); 

     if (movie != null) 
     { 
      movie.Info = "This is the new information"; 
     } 
    } 
} 

實施INotifyPropertyChanged的允許代碼通知UI時有新的變化。

如果您測試此代碼,您會看到單擊此按鈕會更新第一部電影的信息,並且此更改會立即反映在用戶界面中。 (通常你會使用像命令這樣的常規來處理按鈕點擊,但爲了簡單起見,我這樣做)

讓我知道如果您有任何問題。

+0

謝謝,但沒關係,我這樣做,但現在如何設置綁定? .ItemsSource =列表由於{綁定標題}和{綁定信息}而不再執行任何操作。你如何在C#中編程而不是XAML? – user99999991

+0

你與什麼對象合作?這是一部電影或是有什麼標題和信息?說實話,你應用物品的方式並不好。 – TrueEddie

+0

所以我有2個字符串列表。列表A是標題,列表B是以特定順序與標題對應的信息。列表B的字符串每隔X秒鐘就會不斷變化。程序啓動時它們不存在。他們就像我放入OP的方式。因此,myAList [0]與例如(ID:25)的myBList [0]相對應,它是集合中與列表視圖綁定的第一個項目。這就是爲什麼我現在將它們並排在一起,但那樣做效率不高,或者找不到那麼好的東西。我正在努力學習如何清理它。 – user99999991