c# - WPF突出显示Datagrid的Selected Row [英] c# - WPF highlight Selected Row of Datagrid

查看:147
本文介绍了c# - WPF突出显示Datagrid的Selected Row的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发WPF应用程序MVVM模式,我必须在一个 TreeView Grid 。这个想法是突出显示id等于treenode id的行。



显示颜色属性

  public Brush DisplayColor 
{
set
{
_displayColor = value;
NotifyPropertyChanged(DisplayColor);
}

get {return _displayColor;

}

选择TreeNode value.id

  private MessageElementViewModel _selectedMessageElement; 
public MessageElementViewModel SelectedMessageElement
{
set
{
if(_selectedMessageElement == value)return;
this._selectedMessageElement = value;
SearchGrid(value.Id,messageFields);

}
get
{
return this._selectedMessageElement;
}

}

//在网格

  public void SearchGrid(int id,ObservableCollection< MessageFieldViewModel> msgField)
{
if(msgField .Any())
DisplayColor = msgField.Last()。Id == id? Brushes.CadetBlue:Brushes.Black;
}

XAML:调用显示颜色属性以突出显示匹配的ID。
DataGrid



TreeView:

  < TreeView Margin =644,137,6,6Grid.RowSpan =2ItemsSource ={Binding MessageElements [0] .Children [0] .Children,Mode = TwoWay}
SelectedItemChanged =TreeView_OnSelectedItemChanged
SelectedValuePath =Id>

代码在树视图中选择项目;



<$只读主菜单_MainWindowModel = new MainWindowModel();

private void TreeView_OnSelectedItemChanged(object sender,RoutedPropertyChangedEventArgs< object> e)
{
if(_mainWindowModel!= null)
_mainWindowModel.SelectedMessageElement =(MessageElementViewModel)新值
}

编辑:

 < DataGrid Name =DatagridItemsSource ={Binding MessageFields}Margin =4,0,380,6Grid.Row =2AutoGenerateColumns =FalseIsReadOnly = TrueSelectedValue ={Binding SelectedMessageField}
AlternatingRowBackground ={Binding Path = DisplayColor}RowBackground ={Binding Path = DisplayColor}Background =CadetBlue>
< DataGrid.Columns>
< DataGridTextColumn Header =IDBinding ={Binding Id}Width =*/> <! - Foreground ={Binding Path = DisplayColor} - >

< DataGridTextColumn Header =CodeBinding ={Binding Code}Width =*/>
< DataGridTextColumn Header =Field NameBinding ={Binding Name}Width =*/>
< DataGridTextColumn Header =PositionBinding ={Binding Position}Width =*/>
< DataGridTextColumn Header =LengthBinding ={Binding Length}Width =*/>
< /DataGrid.Columns>



为什么我的显示颜色属性不是为了匹配Ids而工作?

解决方案

我想我找到了一种方法来解决这个问题,但是我讨厌它是因为我正在从代码如果我可以在我的虚拟机中执行,将会很好。

  private void TreeView_OnSelectedItemChanged(object sender,RoutedPropertyChangedEventArgs< object> e )
{

foreach(MessageF在Datagrid.ItemsSource中的ieldViewModel项目
{
if(_mainWindowModel!= null)
_mainWindowModel.SelectedMessageElement =(MessageElementViewModel)e.NewValue;


foreach(Datagrid.ItemsSource中的MessageFieldViewModel rowItem)
{
var row = Datagrid.ItemContainerGenerator.ContainerFromItem(rowItem)as DataGridRow;
if(_mainWindowModel.SelectedMessageElement!= null)
if(rowItem.Id == _mainWindowModel.SelectedMessageElement.Id)

row.Background = _mainWindowModel.DisplayColor;

else
row.Background = Brushes.White;

}
}


}


I am working on a WPF application MVVM pattern where I have to create some sort of relationship between a TreeView and a Grid. The idea is to highlight a row with a id equal to the treenode id.

Display color property

    public Brush DisplayColor
    {
        set
        {
            _displayColor = value;
            NotifyPropertyChanged("DisplayColor");
        }

        get { return _displayColor; }

    }

Select TreeNode value.id

    private MessageElementViewModel _selectedMessageElement;
    public MessageElementViewModel SelectedMessageElement
    {
        set
        {
            if (_selectedMessageElement == value) return;
            this._selectedMessageElement = value;
            SearchGrid(value.Id, messageFields);

        }
        get
        {
            return this._selectedMessageElement;
        }

    }

// search matching Id in the grid

     public void SearchGrid(int id, ObservableCollection<MessageFieldViewModel> msgField)
    {
         if (msgField.Any())
            DisplayColor = msgField.Last().Id == id ? Brushes.CadetBlue : Brushes.Black;
    }

XAML: Call the display color property to highlight a matching id. DataGrid

TreeView:

      <TreeView Margin="644,137,6,6" Grid.RowSpan="2" ItemsSource="{Binding MessageElements[0].Children[0].Children,  Mode=TwoWay}"   
                  SelectedItemChanged="TreeView_OnSelectedItemChanged"
                 SelectedValuePath="Id">

Code Behind for treeview select item;

    readonly MainWindowModel _mainWindowModel = new MainWindowModel();

    private void TreeView_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        if (_mainWindowModel != null)
            _mainWindowModel.SelectedMessageElement = (MessageElementViewModel)e.NewValue;
    }

EDIT:

<DataGrid Name="Datagrid"    ItemsSource="{Binding MessageFields}" Margin="4,0,380,6" Grid.Row="2" AutoGenerateColumns="False"  IsReadOnly="True"   SelectedValue="{Binding SelectedMessageField}"
                    AlternatingRowBackground ="{Binding Path=DisplayColor}" RowBackground="{Binding Path=DisplayColor}" Background="CadetBlue">
            <DataGrid.Columns >
                <DataGridTextColumn Header="ID" Binding="{Binding Id}" Width="*"  />      <!--Foreground="{Binding Path=DisplayColor}-->

                <DataGridTextColumn Header="Code" Binding="{Binding Code}" Width="*" />
                <DataGridTextColumn Header="Field Name" Binding="{Binding Name}" Width="*" />
                <DataGridTextColumn Header="Position" Binding="{Binding Position}" Width="*"   />
                <DataGridTextColumn Header="Length" Binding="{Binding Length}" Width="*"  />
 </DataGrid.Columns>

Why is my is my display color property is not working for matching Ids?

解决方案

I guess I found a way to resolve this but I hate it cause I am doing it from code behind. Would be nice if I can do it in my VM.

    private void TreeView_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {

        foreach (MessageFieldViewModel item in Datagrid.ItemsSource)
        {
            if (_mainWindowModel != null)
                _mainWindowModel.SelectedMessageElement = (MessageElementViewModel) e.NewValue;


            foreach (MessageFieldViewModel rowItem in Datagrid.ItemsSource)
            {
                var row = Datagrid.ItemContainerGenerator.ContainerFromItem(rowItem) as DataGridRow;
                if (_mainWindowModel.SelectedMessageElement != null)
                    if (rowItem.Id == _mainWindowModel.SelectedMessageElement.Id)

                        row.Background = _mainWindowModel.DisplayColor;

                     else
                    row.Background = Brushes.White;

            }
        }


    }

这篇关于c# - WPF突出显示Datagrid的Selected Row的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆