Я к новому WPF. Мне нужно передать данные из DataGrid в текстовые поля. Я искал много сайтов, но все объясняли, рассматривая DataGridview (который имеет событие CellContentClick), но этого события нет в DataGrid (я использую vs2010).
Я определил текстовые поля в Usercontrol и использовал их в главном окне для 4 вкладок.
1.MainWindow.xaml код
<Grid>
<TabControl x:Name="TabControl1">
<TabItem Header="View Details" x:Name="Tab1">
<StackPanel>
<uc:CustomerUC x:Name="ViewData"></uc:CustomerUC>
<Button Content="UpdateDataGrid" Height="25" Width="180" Name="UpGridBtn" Click="UpGridBtn_Click" Margin="15" Visibility="{Binding UpGridVisibility}"/>
<DataGrid AutoGenerateColumns="False" CanUserAddRows="False" ItemsSource="{Binding CustomersData}" x:Name="DGdata" Margin="0 20 0 10">
<DataGrid.Columns>
<DataGridTextColumn Header="CustomerID" Binding="{Binding Path=CustoID}" IsReadOnly="True" />
<DataGridTextColumn Header="CustomerName" Binding="{Binding Path=CustoName}" IsReadOnly="True"/>
<DataGridTextColumn Header="CustomerAge" Binding="{Binding Path=CustoAge}" IsReadOnly="True"/>
<DataGridTextColumn Header="CustomerAddress" Binding="{Binding Path=CustoAddress}" IsReadOnly="True"/>
<DataGridTextColumn Header="CustomerEmail" Binding="{Binding Path=CustoEmail}" IsReadOnly="True" />
<DataGridTextColumn Header="CustomerMobile" Binding="{Binding Path=CustoMobile}" IsReadOnly="True"/>
<DataGridTextColumn Header="CustomerUserName" Binding="{Binding Path=CustoUname}" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</TabItem>
<TabItem Header="Add Details" x:Name="Tab2">
<uc:CustomerUC x:Name="AddData"></uc:CustomerUC>
</TabItem>
<TabItem Header="Update Details" x:Name="Tab3">
<uc:CustomerUC x:Name="UpdateData"></uc:CustomerUC>
</TabItem>
<TabItem Header="Delete Details" x:Name="Tab4">
<uc:CustomerUC x:Name="DeleteData"></uc:CustomerUC>
</TabItem>
</TabControl>
</Grid>
2.Код управления пользователя
<StackPanel >
<StackPanel Orientation="Horizontal" Visibility="{Binding CustIDVisibility}" >
<Button x:Name="CustID" Content="Customer ID" Width="100" Margin="82 0 0 0" Click="CustID_Click" />
<ComboBox Height="25" Width="180" x:Name="ComboID" SelectionChanged="ComboID_SelectionChanged" />
</StackPanel>
<StackPanel Orientation="Horizontal" Visibility="{Binding CustomerIDVisibility}" >
<Label x:Name="CustoID" Content="Customer ID" Width="100" Margin="82 0 0 0"/>
<TextBox x:Name="BoxID" Margin="2" Width="180" Text="{Binding ElementName=DGdata, Path=SelectedItem.CustoID}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" >
<Label x:Name="CustName" Content="Customer Name" Width="100" Margin="82 0 0 0"/>
<TextBox x:Name="BoxName" Margin="2" Width="180" Text="{Binding ElementName=DGdata, Path=SelectedItem.CustoName}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label x:Name="CustAge" Content=" Age" Width="100" Margin="82 0 0 0"/>
<TextBox x:Name="BoxAge" Margin="2" Width="180" Text="{Binding ElementName=DGdata, Path=SelectedItem.CustoAge}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" >
<Label x:Name="CustAddress" Content="Address" Width="100" Margin="82 0 0 0"/>
<TextBox x:Name="BoxAddress" Margin="2" Width="180" Text="{Binding ElementName=DGdata, Path=SelectedItem.CustoAddress}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" >
<Label x:Name="CustEmail" Content="Email ID" Width="100" Margin="82 0 0 0"/>
<TextBox x:Name="BoxEmail" Margin="2" Width="180" Text="{Binding ElementName=DGdata, Path=SelectedItem.CustoEmail}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" >
<Label x:Name="CustMobile" Content="Mobile No." Width="100" Margin="82 0 0 0" />
<TextBox x:Name="BoxMobile" Margin="2" Width="180" Text="{Binding ElementName=DGdata, Path=SelectedItem.CustoMobile}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" >
<Label x:Name="CustUname" Content="User Name" Width="100" Margin="82 0 0 0"/>
<TextBox x:Name="BoxUname" Margin="2" Width="180" Text="{Binding ElementName=DGdata, Path=SelectedItem.CustoUname}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Visibility="{Binding pwdVisibility}" >
<Label x:Name="CustPWD" Content="Password" Width="100" Margin="82 0 0 0"/>
<TextBox x:Name="BoxPWD" Margin="2" Width="180" />
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="82 15 0 0" >
<Button x:Name="CancelBtn" Content="Cancel" Width="100" Height="25" Margin="2"/>
<Button x:Name="SaveBtn" Content="Save" Width="100" Height="25" Margin="2" Visibility="{Binding SaveVisibility}" Click="SaveBtn_Click" />
<Button x:Name="UpdateBtn" Content="Update" Width="100" Height="25" Margin="2" Visibility="{Binding UpdateVisibility}" Click="UpdateBtn_Click" />
<Button x:Name="DeleteBtn" Content="Delete" Width="100" Height="25" Margin="2" Visibility="{Binding DeleteVisibility}" Click="DeleteBtn_Click" />
</StackPanel>
</StackPanel>
//
3. Код модели
class CustomerDataModel
{
public int CustoID { get; set; }
public string CustoName { get; set; }
public int CustoAge { get; set; }
public string CustoAddress { get; set; }
public string CustoEmail { get; set; }
public string CustoMobile { get; set; }
public string CustoUname { get; set; }
}
//
Просмотр модели
public CustoDataPassVM ()
{
FillGrid ();
}
public void FillGrid ()
{
PurchaseNowEntities Entity = new PurchaseNowEntities ();
var datalist = from r в Entity.tblCustomerDetails select r;
if (CustomersData == null)
CustomersData = new ObservableCollection<CustomerDataModel>();
foreach (var r in datalist)
{
CustomersData.Add(new CustomerDataModel
{
CustoID = r.CustomerID,
CustoName = r.CustomerName,
CustoAge = r.CustomerAge,
CustoAddress = r.CustomerAddress,
CustoEmail = r.CustomerEmailID,
CustoMobile = r.CustomerMobile,
CustoUname = r.CustomerUname
});
}
}
5. С помощью datacontext я могу получить данные в сетке данных
public MainWindow()
{
InitializeComponent();
CO = new CustoDataPassVM();
DGdata.DataContext = CO;
}
Вывод скриншотов фото
Если я буду использовать и текстовое поле, и сетку данных в одном и том же окне, я смогу получить данные о текстовых полях с помощью
Text="{Binding ElementName=DGdata, Path=SelectedItem.CustoID}
Но когда я разделяю сетку данных в главном окне и текстовых полях в Usercontrol. Я думаю, что он не находит сетку данных ElementName = DGdata в окне usercontrol, поэтому он не является обязательным в texbox, я думаю.
Как передать данные таблицы данных (выбранной строки) из главного окна в текстовые поля управления пользователем
И я попытался с обработчиком SelectionChanged, в этом я должен получить значение каждой ячейки, но это не привязка к текстовым полям (например: BoxName.text получает назначение, но не в текстовом поле этого ..
Код обработчика SelectionChanged:
public void DGdata_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
CustomerUC bindnow = new CustomerUC();
CustomerDataModel row = (CustomerDataModel)DGdata.SelectedItem;
bindnow.BoxName.Text = row.CustoName;
}