2014-02-25 64 views
0

我的應用程序中有一個DataGrid和一個ListView。 ListView提供了有關數據網格所選項目的信息。我在該ListView中放置了一個HyperLink,它應該將數據網格的選定項目更改爲當前選定項目的「父級」。在xaml中設置datagrid的突出顯示的單元格

我的方法是在我的代碼後面設置SelectedItem。一切工作得很好,但數據網格不突出顯示新的選定項目。但我可以清楚地看到它被選中,因爲它的灰色背景色。是否有可能以編程方式設置突出顯示的單元格?

<ListView> 
    <TextBlock Text="{Binding SelectedParameter.Definition.Name, StringFormat=Name: {0:C}}" 
       TextWrapping="Wrap"/> 
    <TextBlock Text="{Binding SelectedParameter.Definition.Type, StringFormat=Datentyp: {0:C}}" 
           TextWrapping="Wrap"/> 
       TextWrapping="Wrap"/> 
    <Hyperlink Command="{Binding GoToMasterParameterCommand}"> 
     Masterparameter 
    </Hyperlink> 
</ListView> 

<DataGrid Name="m_DataGrid" 
       ItemsSource="{Binding Path=Parameters}" 
       SelectedItem="{Binding SelectedParameter}" 
       SelectionMode="Single" 
       AutoGenerateColumns="False" 
       TargetUpdated="m_ParameterDataGrid_TargetUpdated"> 
     <DataGrid.Columns> 
      <DataGridTextColumn 
       Header="ID" 
       Binding="{Binding Id}" 
       IsReadOnly="True"/> 
      <DataGridTextColumn 
       Header="Value" 
       Binding="{Binding Value.CurrentInternalValue, NotifyOnTargetUpdated=True}" 
     </DataGrid.Columns> 
    </DataGrid> 

internal void GoToMasterParameter() 
{ 
    string parentId = GetParentId(this.SelectedParameter); 
    this.SelectedParameter = this.Parameters.Single(item => item.Id == parentId); 
} 

回答

0

你的問題是,所選擇的行/細胞不被聚焦的焦點仍然在你的ListView項。你可以做的是設計xaml中的DataGridCell元素。下面是證明這一小段代碼:

<Window.Resources> 
    <Style TargetType="{x:Type DataGridCell}"> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" Value="True"> 
       <Setter Property="Background" Value="Red"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 
    <DataGrid ItemsSource="{Binding Tests}" 
       SelectedItem="{Binding GridSelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
       SelectedIndex="{Binding SelectedGridIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 

</DataGrid> 
    <Button Command="{Binding ChangeSelectedItemCommand}" 
      Content="Change Grid Selected item" 
      Grid.Column="1" 
      VerticalAlignment="Top"/> 
</Grid> 

,這裏的視圖模型部分:

public class MainWindowViewModel : INotifyPropertyChanged 
{ 
    #region Private members 

    private List<TestClass> _tests; 
    private TestClass _gridSelectedItem; 
    private ICommand _changeSelectedItemCommand; 
    private int _selectedGridIndex; 
    #endregion 

    #region Constructor 

    public MainWindowViewModel() 
    { 
     Tests = new List<TestClass>(); 
     for (int i = 0; i < 25; i++) 
     { 
      TestClass testClass= new TestClass {Name = "Name " + i, Title = "Title" + i}; 
      Tests.Add(testClass); 
     } 
    } 

    #endregion 

    #region Public properties 
    public List<TestClass> Tests 
    { 
     get { return _tests; } 
     set 
     { 
      _tests = value; 
      OnPropertyChanged("Tests"); 
     } 
    } 

    public TestClass GridSelectedItem 
    { 
     get { return _gridSelectedItem; } 
     set 
     { 
      _gridSelectedItem = value; 
      OnPropertyChanged("GridSelectedItem"); 
     } 
    } 

    public int SelectedGridIndex 
    { 
     get { return _selectedGridIndex; } 
     set 
     { 
      _selectedGridIndex = value; 
      OnPropertyChanged("SelectedGridIndex"); 
     } 
    } 

    #endregion 

    public ICommand ChangeSelectedItemCommand 
    { 
     get { return _changeSelectedItemCommand ?? (_changeSelectedItemCommand = new SimpleCommand(p => ChangeSelectedGridItem())); } 
    } 

    private void ChangeSelectedGridItem() 
    { 
     SelectedGridIndex++; 
    } 

    #region INotifyPropertyChanged 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    #endregion 
} 

演示對象類:

public class TestClass 
{ 
    public string Title { get; set; } 
    public string Name { get; set; } 
} 

和一些命令類:

public class SimpleCommand : ICommand 
{ 

    private readonly Predicate<object> _canExecuteDelegate; 

    private readonly Action<object> _executeDelegate; 

    #region Constructors 

    public SimpleCommand(Action<object> execute) 
     : this(execute, null) 
    { 
    } 

    public SimpleCommand(Action<object> execute, Predicate<object> canExecute) 
    { 
     if (execute == null) 
     { 
      throw new ArgumentNullException("execute"); 
     } 

     _executeDelegate = execute; 
     _canExecuteDelegate = canExecute; 
    } 

    #endregion // Constructors 

    #region ICommand Members 

    public virtual bool CanExecute(object parameter) 
    { 
     return _canExecuteDelegate == null || _canExecuteDelegate(parameter); 
    } 

    public event EventHandler CanExecuteChanged 
    { 
     add { CommandManager.RequerySuggested += value; } 
     remove { CommandManager.RequerySuggested -= value; } 
    } 

    public void Execute(object parameter) 
    { 
     _executeDelegate(parameter); 
    } 

    #endregion 
} 

M AKE一定要添加在DataContext視圖,使其知道您的視圖模型:

public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new MainWindowViewModel(); 
    } 

我希望這可以幫助你獲得預期的效果。

+0

我想我錯過了一些東西。這段代碼似乎根本沒有操縱焦點邏輯。我做了一個相當類似的方法。當我按下編輯SelectedItem屬性的鏈接時,數據綁定會更新數據網格。所以我期望有可能通過數據綁定設置FocusedItem –

+0

這個片段會影響所選項目的背景。您可以只更改背景顏色,並將注意力集中在單擊的項目上,或者獲取真實的DataGridCell或DataGridRow並將其傳遞給轉換器,您可以在實際的GUI對象上設置.Focus()屬性。這會將焦點從listview項目移動到DataGridRow/Cell –

相關問題