我不知道如何從嵌套的 DataGrid正確系結SelectedItem。在主 DataGrid 中,我有一個這樣的系結:
SelectedItem="{Binding SelectedElement}"
和它的作業好-如果我選擇元素在DataGrid的財產SelectedElement從MainVM類設定為選定的元素。我在嵌套的 DataGrid 中有一個類似的系結:
SelectedItem="{Binding SelectedMyItem}"
但它根本不起作用 - 當我在嵌套的 DataGrid 中選擇專案時,屬性SelectedMyItem仍然為null。
我的問題:
如何系結 SelectedMyItem 屬性,以便在 DataGrid 中選擇專案后設定它?
我沒有從 IDE 獲得任何系結錯誤資訊。
這是一個顯示我的問題的簡單示例:
課程:
using System.Collections.ObjectModel;
namespace NesteGridMVVM
{
public class MyItem
{
public string MyItemName { get; set; }
}
//======================================================================
public class Element
{
private MyItem _selectedItem;
public string ElementName { get; set; }
public ObservableCollection<MyItem> MyItemsList { get; set; } = new ObservableCollection<MyItem>();
//Binded to SelectedItem in nested DataGrid
public MyItem SelectedMyItem
{
get => _selectedItem;
set
{
_selectedItem = value;
//Show, if MyItem was selected - it not work.
System.Diagnostics.Debug.Print($"Selected MyItem: {_selectedItem.MyItemName}");
}
}
}
//======================================================================
public class MainVM
{
private Element _selectedElement;
public ObservableCollection<Element> ElementsList { get; set; } = new ObservableCollection<Element>();
//Binded to SelectedItem in main DataGrid
public Element SelectedElement
{
get => _selectedElement;
set
{
_selectedElement = value;
//Show, if Element was selected - it works OK
System.Diagnostics.Debug.Print($"{_selectedElement.ElementName}");
}
}
//ctor - populate view model
public MainVM()
{
Element elem1 = new Element() { ElementName = "element-01" };
Element elem2 = new Element() { ElementName = "element-02" };
elem1.MyItemsList.Add(new MyItem() { MyItemName = "item-A" });
elem1.MyItemsList.Add(new MyItem() { MyItemName = "item-B" });
elem2.MyItemsList.Add(new MyItem() { MyItemName = "item-C" });
ElementsList.Add(elem1);
ElementsList.Add(elem2);
}
}
}
XAML:
<Window x:Class="NesteGridMVVM.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:NesteGridMVVM"
mc:Ignorable="d"
Title="MainWindow" Height="550" Width="600">
<Window.DataContext>
<local:MainVM />
</Window.DataContext>
<DataGrid
x:Name="MainDG"
ItemsSource="{Binding ElementsList}"
AutoGenerateColumns="True"
SelectedItem="{Binding SelectedElement}"
RowDetailsVisibilityMode="Visible">
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid
x:Name="NestedDG"
ItemsSource="{Binding MyItemsList}"
AutoGenerateColumns="True"
SelectedItem="{Binding SelectedMyItem}">
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
</Window>
uj5u.com熱心網友回復:
在我看來,您可以將系結觸發器修改為開啟PropertyChanged:
SelectedItem="{Binding SelectedMyItem, UpdateSourceTrigger=PropertyChanged}"
但是,請注意以下事項:
當我在除錯器中運行它時,嵌套的 DataGrid 選擇在外部 DataGrid 之前觸發。意思是setforSelectedMyItem會在之前觸發SelectedElement。這當然僅在您更改外部 DataGrid 中的行時才適用。
完整的.xaml:
<Window x:Class="NesteGridMVVM.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:NesteGridMVVM"
mc:Ignorable="d"
Title="MainWindow" Height="550" Width="600">
<Window.DataContext>
<local:MainVM />
</Window.DataContext>
<DataGrid
x:Name="MainDG"
ItemsSource="{Binding ElementsList}"
AutoGenerateColumns="True"
SelectedItem="{Binding SelectedElement}"
RowDetailsVisibilityMode="Visible">
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid
x:Name="NestedDG"
ItemsSource="{Binding MyItemsList}"
AutoGenerateColumns="True"
SelectedItem="{Binding SelectedMyItem, UpdateSourceTrigger=PropertyChanged}">
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
</Window>
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/334477.html
上一篇:預選單選按鈕WPFMVVM
