Привязка TextBlock к элементу listBox в серебристом цвете с использованием MVVM - PullRequest
1 голос
/ 10 апреля 2011

Я занимаюсь разработкой навигационного приложения silverlight и столкнулся со следующей проблемой. Я использую MVVM для подключения списка с классом. У класса есть имя, текст и адрес электронной почты.

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>

Как сделать кнопки гиперссылок кликабельными. Я настроил все в viewmodel, но после того, как я нажимаю на ссылку, ничего не происходит. Я думаю, это потому, что кнопка является элементом списка, но я не уверен, как ее решить.

Надеюсь, что кто-нибудь сможет мне помочь хотя бы с одной проблемой ...

Edit: Спасибо за ответы ... первый работает отлично, а второй нет ... у меня точно такая же команда, как и на сайте, который вы упомянули. Вот что я сделал, но он не работает:

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 ]

2 голосов
/ 01 ноября 2011

создать новый класс вместо списка строк в контактной информации

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

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

изменить список свойств строки на список DataClass

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>
1 голос
/ 11 апреля 2011

1) Text = "{Binding}" /> 2) создать новый тип со свойствами. String DisplayAddress, String Address, ICommand NavigateCommand;Пожалуйста, смотрите эту ссылку для команды craeting http://www.silverlightshow.net/items/Silverlight-4-How-to-Command-Control.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...