2011-04-10 10 views
1

실버 라이트 네비게이션 애플리케이션을 개발 중이며 다음과 같은 문제가 발생했습니다. MVVM을 사용하여 클래스와 목록 상자를 연결합니다. 수업은 이름, 일부 텍스트 및 이메일 주소입니다.MVB를 사용하여 silverbox의 ListBox에 TextBlock을 바인딩

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> 

것 같습니다.

문자열 목록 인 데이터에 목록 상자를 바인딩하려고합니다. 나는 분리 된 본체에서 원하는이 요소 ...의 각 속성에 내가 하이퍼 링크 버튼을 클릭 할 수있는 방법 올바른 데이터

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

를 보여줍니다 그래서이 texblock을 결합해야합니까. 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)); 
     } 
    } 

이 그냥이 지금

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

좋아 모두 지우기

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

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

와 바인딩 외모를 가지고 실제 URL 클래스입니다 디버그 모드에서 NavigateCommand를 실행하지 않습니다 ...

답변

1

1) Text = "{Binding}"/> 2) create 속성이있는 새 유형입니다. 문자열 DisplayAddress, 문자열 주소, ICommand NavigateCommand; , 연락처 정보

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

DataClass

목록으로 문자열 속성 목록에 대신 문자열 목록의 새로운 클래스를 생성 명령 http://www.silverlightshow.net/items/Silverlight-4-How-to-Command-Control.aspx

2

을 craeting이 링크를 참조하시기 바랍니다 }

이제 "DataName"이라는 Dataclass의 속성으로 Textblock을 바인딩 할 수 있습니다

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