MVVM-如何将字符串的ObservableCollection绑定到ListBox WPF中

时间:2014-06-12 03:24:35

标签: c# wpf xaml mvvm listbox

通常我将ObservableCollection绑定到我自己的类。但在这种情况下,我需要使用MVVM将ListBox中的ObservableCollection绑定到WPF中。

我的xml是

<Window x:Class="ListBoxDynamic.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    xmlns:vm="clr-namespace:ListBoxDynamic.ViewModel">
<Grid Margin="0,0,-8,0">
    <ListBox Width="100" Height="90"  ItemsSource="{Binding ListOfItems}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <ToggleButton Command="{Binding SelectItemCommand}" CommandParameter="{Binding ElementName=Item}" >
                    <ToggleButton.Template>
                        <ControlTemplate TargetType="ToggleButton">
                            <TextBlock x:Name="Item" Text="{Binding What I must to write?}" />
                        </ControlTemplate>
                    </ToggleButton.Template>
                </ToggleButton>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

我的MainViewModel

private ObservableCollection<string> _listOfItems = new ObservableCollection<string>();
    public ObservableCollection<string> ListOfItems
    {
        get { return _listOfItems; }
        set { _listOfItems = value; RaisePropertyChanged("ListOfItems"); }
    }

    public ICommand SelectItemCommand { get; private set; }
    int counter = 1;
    public MainViewModel()
    {
        ListOfItems.Add("Add new Item");
        SelectItemCommand = new RelayCommand<object>((x) => ExecuteSelectItemCommand(x));

    }

但我不知道我必须在Binding TextBlock中写入ToggleButton。

2 个答案:

答案 0 :(得分:1)

我注意到的问题很少

  • 该命令在视图模型中可用,而不是数据项,因此使用相对源绑定到命令
  • &#34; {结合}&#34;可用于引用当前Item,因此无需使用elementname语法
  • 然后,您可以使用内容展示器使其更灵活,而不是在切换按钮内放置文本框

所以这可能就像这样

<ListBox Width="100"
         Height="90"
         ItemsSource="{Binding ListOfItems}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ToggleButton Command="{Binding SelectItemCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}}"
                          CommandParameter="{Binding}"
                          Content="{Binding}">
                <ToggleButton.Template>
                    <ControlTemplate TargetType="ToggleButton">
                        <ContentPresenter />
                    </ControlTemplate>
                </ToggleButton.Template>
            </ToggleButton>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

答案 1 :(得分:1)

由于支持每个ListBoxItem的数据是字符串,因此每个DataContext的{​​{1}}都是字符串。

因此,执行ListBoxItem将显示支持文本块

中listboxitem的字符串