0

C# 和 MVVM 相对较新,但我正在使用 MVVM Light Toolkit 制作一个 WP7 应用程序。我在 ListBox 中对属性进行双向绑定时遇到问题。我有一个 ObservableCollection 客户端,我正在尝试选择一个单独的客户端(单击它时会将我带到一个新的 ViewModel)。

当我单击所选项目时,它应该更新 SelectedItem 属性并将值设置为单击的客户端。但是,当单击它时,它甚至没有到达设置器(我用 * 标记了断点)。有谁知道我哪里出错了或者有更好的解决方案?我已经在这个地方拖了好几个小时了!

XAML 标记:

        <ListBox SelectedItem="{Binding SelectedItem, Mode=TwoWay}" ItemsSource="{Binding ClientList, Mode=TwoWay}" x:Name="FirstListBox" Margin="0,0,-12,0" ScrollViewer.VerticalScrollBarVisibility="Auto">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Margin="0,0,0,17" Width="432">
                    <Button CommandParameter="{Binding}">
                        <helper:BindingHelper.Binding>
                            <helper:RelativeSourceBinding Path="ShowClientCommand" TargetProperty="Command"
                                    RelativeMode="ParentDataContext" />
                        </helper:BindingHelper.Binding>
                        <Button.Template>
                            <ControlTemplate>
                                <TextBlock Text="{Binding Name}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" />
                            </ControlTemplate>
                        </Button.Template>
                    </Button>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

视图模型属性:

    public ObservableCollection<Client> ClientList
    {
        get 
        {
            return _clientList;
        }
        set 
        {
            _clientList = value;
            RaisePropertyChanged("ClientList");
        }
    }

    public Client SelectedItem
    {
        get
        {
            return _selectedItem;
        }
        set
        {
         *   _selectedItem = value;
            RaisePropertyChanged("SelectedItem");
        }
    }
4

1 回答 1

0

难道是因为你没有注册 selection_changed 事件它没有改变属性?

我不完全确定为什么这不起作用,但这是我一直使用的解决方案,并且模板推荐。

为您的列表框注册 SelectionChanged 事件,如下所示:

<ListBox SelectionChanged="FirstListBox_SelectionChanged" ItemsSource="{Binding ClientList, Mode=TwoWay}" x:Name="FirstListBox" Margin="0,0,-12,0" ScrollViewer.VerticalScrollBarVisibility="Auto">

然后在相应的 .cs 文件中,有一个如下所示的处理程序:

private void FirstListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // If selected index is -1 (no selection) do nothing
    if (FirstListBox.SelectedIndex == -1)
        return;

    // get the client that's selected
    Client client = (Client) FirstListBox.selectedItem;

    //... do stuff with the client ....

    // reset the index (note this will fire this event again, but
    // it'll automatically return because of the first line
    FirstListBox.SelectedIndex = -1;
}
于 2012-03-15T23:48:23.163 回答