2011-04-10 37 views
1

我正在開發Silverlight導航應用程序並遇到以下問題。我正在使用MVVM將一個列表框與一個類連接起來。班上有一個名字,一些文字和一個電子郵件地址。將TextBlock綁定到使用MVVM的silveright中的列表框項目

public class ContactPage 
{ 
    public List<ContactInfo> Contacts { get; set; } 
    public Image Image { get; set; } 
    public string Description { get; set; } 


    //some other code not needed 
} 

public class ContactInfo 
{ 
    public string Name { get; set; } 
    public List<string> Data { get; set; } 
    public List<Url> Urls { get; set; } 

    public ContactInfo(string name, List<string> data, List<string> urls) 
    { 
     Name = name; 
     Data = data; 

     Urls = urls; 
    }    
} 

包含有問題的部分XAML文件看起來像這樣

<ListBox ItemsSource="{Binding ContactPage.Contacts, Mode=TwoWay}" > 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock Text="{Binding Name, Mode=TwoWay}" FontWeight="Bold"/> 
         <ListBox x:Name="dataListBox" ItemsSource="{Binding Data, Mode=TwoWay}"> 
          <ListBox.ItemTemplate> 
           <DataTemplate> 
            <TextBlock Text="???"/> 
           </DataTemplate> 
          </ListBox.ItemTemplate> 
         </ListBox> 
         <ListBox ItemsSource="{Binding Urls, Mode=TwoWay}"> 
          <ListBox.ItemTemplate> 
           <DataTemplate> 
            <HyperlinkButton Content="{Binding Address, Mode=TwoWay}" ClickMode="Press"> 
             <i:Interaction.Triggers> 
              <i:EventTrigger EventName="Click"> 
               <cmd:EventToCommand Command="{Binding NavigateCommand}" 
                    CommandParameter="{Binding Action, Mode=TwoWay}"/> 
              </i:EventTrigger> 
             </i:Interaction.Triggers> 
            </HyperlinkButton> 
           </DataTemplate> 
          </ListBox.ItemTemplate> 
         </ListBox> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

我現在有兩個問題。

我想將列表框綁定到數據,這是一個字符串列表。這每一個元素,我想在一個分離的文本塊...的對哪些財產做我有這個texblock綁定,以便它顯示了正確的數據

<ListBox x:Name="dataListBox" ItemsSource="{Binding Data, Mode=TwoWay}"> 
          <ListBox.ItemTemplate> 
           <DataTemplate> 
            <TextBlock Text="???"/> <!--What to put here???--> 
           </DataTemplate> 
          </ListBox.ItemTemplate> 
         </ListBox> 

我怎樣才能使超鏈接按鈕點擊。我已經在viewmodel中設置了所有內容,但是在點擊鏈接後沒有任何反應。我想這是因爲按鈕是一個列表項,但不知道如何解決它。

。希望有人能幫助我與至少一個問題...

編輯: 謝謝你的答案......第一個偉大的工程,但第二犯規......我有一樣的制高點就像你提到的那個網站一樣。下面是我做的,但它不工作:

public ICommand NavigateCommand 
    { 
     get { return new RelayCommand<object>(param => Navigate(param), param => true); } 
    } 
private void Navigate (object parameter) 
    { 
     Url url = parameter as Url; 
     if (url.Action.StartsWith("http")) 
     { 
      HtmlPage.Window.Navigate(new Uri(url.Action, UriKind.Absolute), "_blank"); 
     } 
     else if (url.Action.StartsWith("mailto")) 
     { 
      HtmlPage.Window.Navigate(new Uri(url.Action, UriKind.Absolute)); 
     } 
    } 

這是實際的URL類正好有全部清除

public class Url 
{ 
    public string Address { get; set; } 
    public string Action { get; set; } 

    public Url(string address, string action) 
    { 
     Address = address; 
     Action = action; 
    } 
} 

,並結合這個樣子的,現在

<ListBox Name="linkListBox" ItemsSource="{Binding Urls, Mode=TwoWay}"> 
          <ListBox.ItemTemplate>          
           <DataTemplate> 
            <HyperlinkButton Content="{Binding Address, Mode=TwoWay}" ClickMode="Press"> 
             <i:Interaction.Triggers> 
              <i:EventTrigger EventName="Click"> 
               <cmd:EventToCommand Command="{Binding NavigateCommand}" 
                    CommandParameter="{Binding ElementName=linkListBox, Path=SelectedItem}"/> 
              </i:EventTrigger> 
             </i:Interaction.Triggers> 
            </HyperlinkButton> 
           </DataTemplate> 
          </ListBox.ItemTemplate> 
         </ListBox> 

它不在調試模式下觸發NavigateCommand ...

回答

2

創建一個新的類,而不是字符串列表中的聯繫人信息

public DataClass 
{ 
    public string DataName { get; set; } 

    public DataClass(string dataName) 
    { 
     DataName = dataName; 
    } 
} 

改變字符串屬性的列表,以數據類

public class ContactInfo 
{ 
    public string Name { get; set; } 
    public List<Dataclass> Data { get; set; } 
    public List<Url> Urls { get; set; } 

    public ContactInfo(string name, List<string> data, List<string> urls) 
    { 
     Name = name;  

     Urls = urls; 

    var objDataClass = ne List<Dataclass>(); 

    foreach(string str in data) 
    { 
     objDataClass.Add(new Dataclass(str)); 
    } 
    Data = objDataClass; 
}    

名單}

現在您可以將Textblock與Dataclass中名爲「DataName」的屬性綁定在一起

<ListBox x:Name="dataListBox" ItemsSource="{Binding Data, Mode=TwoWay}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding DataName}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox>