2

我有一个列表框:

<ListBox Name="lbsfHolder" 
         ItemsSource="{Binding UISupportingFunctions}"
         SelectedItem="{Binding Path=SelectedSupportedFunction, Mode=TwoWay}"
         SelectionMode="Multiple"
         IsSynchronizedWithCurrentItem="True"
         HorizontalContentAlignment="Stretch">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <controls:SupportingFunction GotFocus="SupportingFunction_GotFocus"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

在 ViewModel 我有:

private SupportingFunction _selectedSupportedFunction;

public SupportingFunction SelectedSupportedFunction
{
    get { return _selectedSupportedFunction; }
    set
    {
        _selectedSupportedFunction = value;
        NotifyPropertyChanged("SelectedSupportedFunction");
    }
}

但是当我试图选择列表框中的任何项目时,什么都没有发生。对于 ListBox 和 SelectedValue,SelectedItem 也为空。我是否需要添加一些特殊代码才能完成这项工作?

升级版:

我已经改变了一些看法,现在我有:

<UserControl x:Class="RFM.UI.WPF.Controls.SupportingFunction">
    <Grid>
        <ListBox Name="supportingFunctions"
                 ItemsSource="{Binding UISupportingFunctions}"
                 SelectedItem="{Binding Path=SelectedSupportedFunction, Mode=TwoWay}"
                 SelectionMode="Multiple"
                 IsSynchronizedWithCurrentItem="True"
                 HorizontalContentAlignment="Stretch">
            <ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="30" />
                                        <ColumnDefinition />
                                        <ColumnDefinition Width="30" />
                                    </Grid.ColumnDefinitions>
                                    <TextBox Name="tbsfName" Grid.Column="0" Text="{Binding Path=Title, Mode=TwoWay}"></TextBox>
                                    <TextBox Name="tbsfExperssion" Grid.Column="1" Text="{Binding Path=Expression}" HorizontalAlignment="Stretch"></TextBox>
                                    <Button Name="bsfDel" Grid.Column="2">Del</Button>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.ItemContainerStyle>
        </ListBox>
    </Grid>
</UserControl>

在放置此控件的页面中:

<StackPanel Name="spSupportingFunctions">
            <StackPanel Name="spsfOperations" Orientation="Horizontal">
                <Button Name="bsfAdd" Width="30" Command="commands:CustomCommands.AddSupportingFunction">Add</Button>
            </StackPanel>
            <controls:SupportingFunction DataContext="{Binding Self}" />                
        </StackPanel>

在本页后面的代码处

public PlotDataPage()
    {
        DataContext = new PlotDataViewModel();
        InitializeComponent();            
    }

这是 PlotDataViewModel 的完整列表

public class UISupportingFunction : ISupportingFunction
{
    public string Title { get; set; }
    public string Expression { get; set; }
}

public class PlotDataViewModel : INotifyPropertyChanged
{
    public PlotDataViewModel Self
    {
        get
        {
            return this;
        }
    }

    private ObservableCollection<UISupportingFunction> _supportingFunctions;
    public ObservableCollection<UISupportingFunction> UISupportingFunctions
    {
        get
        {
            return _supportingFunctions;
        }
        set
        {
            _supportingFunctions = value;
            NotifyPropertyChanged("UISupportingFunctions");
        }
    }       

    private UISupportingFunction _selectedSupportedFunction;
    public UISupportingFunction SelectedSupportedFunction
    {
        get
        {
            return _selectedSupportedFunction;
        }
        set
        {
            _selectedSupportedFunction = value;
            NotifyPropertyChanged("SelectedSupportedFunction");
        }
    }

    public PlotDataViewModel()
    {
        UISupportingFunctions = new ObservableCollection<UISupportingFunction>();           
    }

    public void CreateNewSupportingFunction()
    {
        UISupportingFunctions.Add(new UISupportingFunction() { Title = Utils.GetNextFunctionName() });
    }

    private void NotifyPropertyChanged(string info)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(info));
    }

    public event PropertyChangedEventHandler PropertyChanged;       
}

单击添加按钮时,我只是在调用 CreateNewSupportingFunction() 方法。一切看起来都很好 - 添加了这些项目,我看到了它们。但是,当我单击其中一个文本框,然后单击每个项目右侧的 bsfDel 按钮时,我在 SelectedSupportedFunction 中得到空值。

也许是因为焦点事件是由 TextBox 而不是 ListBox 处理的?

4

1 回答 1

0

要么是您的 ItemsSource UISupportingFunctions 不是 SupportingFunction 对象,要么是您没有将 View 的 Datacontext 设置为 ViewModel。

ViewModel.xaml.cs

this.DataContext = new ViewModelClass();
于 2012-08-05T22:38:48.907 回答