2012-08-05 47 views
1

ListBox中的我有一個列表框:的SelectedItem用的DataTemplate

<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> 

在視圖模型我:

private SupportingFunction _selectedSupportedFunction; 

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

但是,當我試圖選擇列表框中的什麼也沒有發生任何項目。 SelectedItem對於ListBox和SelectedValue也是null。我需要添加一些特殊的代碼來完成這項工作嗎?

UPD:

我改變看法了一下,現在我有:

<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處理?

+0

不知道問題到底是什麼,但如果SupportingFunction是控制,它不應該在你的ViewModel ... – 2012-08-05 21:50:22

+0

你是什麼UISupportingFunctions? – 2012-08-05 22:10:11

+0

您似乎沒有設置DataContext進行控制 – dvvrd 2012-08-05 22:23:53

回答

0

它或者是你的ItemsSource UISupportingFunctions不是一個SupportingFunction對象,或者你沒有設置視圖的Datacontext到你的ViewModel。

ViewModel.xaml.cs

this.DataContext = new ViewModelClass();