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");
    }
}

しかし、リスト ボックス内の項目を選択しようとしても、何も起こりません。SelectedItem は、ListBox と SelectedValue についても null です。これを機能させるために特別なコードを追加する必要がありますか?

更新:

ビューを少し変更しましたが、次のようになりました。

<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() メソッドが呼び出されます。すべて問題ないように見えます - アイテムが追加され、表示されます。しかし、TextBoxes の 1 つをクリックしてから、各項目の bsfDel ボタンをクリックすると、SelectedSupportedFunction で null になります。

フォーカス イベントが ListBox ではなく TextBox で処理されているためでしょうか。

4

1 に答える 1

0

これは、ItemsSource UISupportingFunctionsがSupportingFunctionオブジェクトではないか、ビューのDatacontextをViewModelに設定していないかのいずれかです。

ViewModel.xaml.cs

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