2012-05-10 3 views
0

В WPF, как создать ярлык, например ItemsControl/Selector? Мне нужен элемент управления, который похож на метку, но может подавать коллекцию данных из свойства ItemsSource и дублировать текст в соответствии с свойством DisplayMemberPath. Пользователь не может изменить значение. Это только для отображения.WPF-метка как ItemsControl/Selector

ответ

0

Все, что вам нужно, это ItemsControl с использованием StackPanel в качестве ItemsPanel, что-то вроде этого:

Xaml

<Grid> 
    <Grid.DataContext> 
     <local:TestViewModel/> 
    </Grid.DataContext> 
    <ItemsControl ItemsSource="{Binding Items}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding ItemText}" Margin=5/> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Grid> 

Или, если вы хотите использовать DisplayMemberPath вы могли бы

<Grid> 
    <Grid.DataContext> 
     <local:TestViewModel/> 
    </Grid.DataContext> 
    <ItemsControl ItemsSource="{Binding Items}" DisplayMemberPath="ItemText"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 
</Grid> 

Просмотр модели

public class TestViewModel 
{ 
    public TestViewModel() 
    { 
     Items = new List<TestItem> 
        { 
         new TestItem{ItemText = "One"}, 
         new TestItem{ItemText = "Two"}, 
         new TestItem{ItemText = "Three"}, 
        }; 
    } 
    public IEnumerable<TestItem> Items { get; set; } 
} 

public class TestItem 
{ 
    public string ItemText { get; set; } 
} 

Простой (немного Hacky) решение для отображения одного выбранного элемента текста является стиль Окно списка

<Grid> 
    <Grid.DataContext> 
     <local:TestViewModel/> 
    </Grid.DataContext> 
    <Grid.Resources> 
     <Style TargetType="ListBox"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ListBox"> 
         <TextBlock Text= 
            "{Binding RelativeSource= 
            {RelativeSource Mode=TemplatedParent}, 
            Path=SelectedItem.ItemText}"/> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Grid.Resources> 
    <ListBox Grid.Row="2" ItemsSource="{Binding Items}" SelectedIndex="2" /> 
</Grid> 

Лучшим решением было бы создать пользовательский элемент управления на основе Selector, и сделать управление templatable ,

+0

Что делать, если мне нужно отображать только SelectedItem? Как поле со списком, но отображаемое как текстовый блок – linquize

Смежные вопросы