2013-06-11 62 views
2

我希望有人愿意帮助我。 我对MVVM很新颖,阅读完曼尼贴子后,我仍然无法弄清楚这一点。MVVM Treeview选定项目

我有EF数据库填写项目和计算属于每个项目。 我使用treeview和HierarchicalDataTemplate显示项目和计算。 当我点击一个TreeView项目,我想一个标签的文本绑定在

public string totaalPrijs 

进行设置,但我只是无法弄清楚如何做到这一点!

这是我CalculationViewModel外观

namespace Treeview_test1.ViewModel 
{ 
public class CalculationViewModel : ViewModelBase 
{ 
    public CalculationViewModel(TableItemChildren child) 
    { 
     this.Child = child; 
     IsChecked = false; 
    } 

    public TableItemChildren Child { get; protected set; } 

    public string totaalPrijs 
    { 
     get { return Child.dbTotaalPrijs; } 
     set 
     { 
      if (Child.dbTotaalPrijs != value) 
      { 
       Child.dbTotaalPrijs = value; 
       RaisePropertyChanged("totaalPrijs"); 
      } 
     } 
    } 

    private bool _isChecked; 
    public bool IsChecked 
    { 
     get { return _isChecked; } 
     set 
     { 
      if (_isChecked != value) 
      { 
       _isChecked = value; 
       RaisePropertyChanged("IsChecked"); 
      } 
     } 
    } 

} 

,这里是我的ItemViewModel

namespace Treeview_test1.ViewModel 
{ 
public class ItemViewModel : ViewModelBase 
{ 
    public ItemViewModel() 
    { 
     calcVMColl = new ObservableCollection<CalculationViewModel>(); 
     foreach (TableItemChildren calc in Service.getItemCalculations("1")) 
     { 
      calcVMColl.Add(new CalculationViewModel(calc)); 
     } 
    } 

    // Switch between real and mock data 
    private IGetCalculations _service; 
    public IGetCalculations Service 
    { 
     get 
     { 
      if (_service == null) 
      { 
       if (IsInDesignMode) 
        _service = new MockCalculations(); 
       else 
        _service = new GetCalculations(); 
      } 
      return _service; 
     } 
     set 
     { 
      _service = value; 
     } 
    } 

    private ObservableCollection<CalculationViewModel> _calcVMColl; 
    public ObservableCollection<CalculationViewModel> calcVMColl 
    { 
     get { return _calcVMColl; } 
     set 
     { 
      if (calcVMColl != value) 
      { 
       _calcVMColl = value; 
       RaisePropertyChanged("calcVMColl"); 
      } 
     } 
    } 
} 

和XAML

<Window x:Class="Treeview_test1.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:ViewModel="clr-namespace:Treeview_test1.ViewModel"> 
<Window.DataContext> 
    <ViewModel:ItemViewModel /> 
</Window.DataContext> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="204" /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <TreeView x:Name="tree" Width="195" HorizontalAlignment="Left" ItemsSource="{Binding calcVMColl}" Background="LightGray" Grid.Column="0" RenderTransformOrigin="1.016,0.509"> 
     <TreeView.ItemContainerStyle> 
      <Style TargetType="{x:Type TreeViewItem}"> 
       <Setter Property="IsSelected" Value="{Binding IsChecked, Mode=TwoWay}" /> 
       <Style.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="FontSize" Value="10" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </TreeView.ItemContainerStyle> 
     <TreeView.Resources> 
      <DataTemplate DataType="{x:Type ViewModel:CalculationViewModel}"> 
       <Label Content="{Binding totaalPrijs}" /> 
      </DataTemplate> 
     </TreeView.Resources> 
    </TreeView> 
    <Label Grid.Column="1" HorizontalAlignment="Left" Margin="39,39,0,0" VerticalAlignment="Top" Content="{Binding....?}" Foreground="Black" FontFamily="segeo ui" FontSize="20" /> 
</Grid> 

因此,在短期:如何绑定文本 我的标签到当前选定的树视图项?

在此先感谢

阿迪

回答

1

绑定的TreeViewSelectedItemLabel(或TextBlock)是相当简单:

<TreeView Name="myTreeview"/> 
<TextBlock Text="{Binding SelectedItem, ElementName=myTreeview, Mode=OneWay}"/> 

但是事实上这并不会显示你想要什么,因为TreeViewSelectedItem通常是Object而您需要string以显示在TextBlock

处理此问题的一种方法是在绑定上使用Converter。您可以实施IValueConverter并让它从SelectedItem返回所需的字符串。

class GetTextFromItemConverter : IValueConverter 
    { 
     object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
     TreeViewItem itm = (TreeViewItem)value; 
     string myString = null; 
     //Retrieve whatever portion of the TreeViewItem you want to put in myString. 
     return myString; 
     } 

     object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
     throw new NotImplementedException(); 
     } 
    } 

然后在你的TextBlock绑定将是这样的:

<TextBlock Text="{Binding SelectedItem, Converter={StaticResource GetTextFromItemConverter}, ElementName=myTreeview, Mode=OneWay}"/>