У меня есть список, который я связал (двухсторонний) с датируемым. Привязка работает нормально, и данные правильно отображаются в списке. Теперь то, чего я хочу достичь, немного сложнее, и я даже не уверен, можно ли этого достичь или сейчас.
Моя таблица данных содержит 15 столбцов, и я показываю 5 столбцов в lisview. Возможно ли, что если пользователь выберет строку в просмотре списка, я мог бы отобразить другие 10 значений для этой выбранной строки (из таблицы данных) в текстовых блоках на панели стека. Это достижимо или я слишком требователен? Я пытался добиться этого, получая идеи из вопроса здесь , но не смог этого достичь.
Если это достижимо, ребята, можете ли вы дать мне идеи о том, как действовать с этим?
Я думаю, что это может быть достигнуто путем обработки события listview1_selectionChanged и заполнения текстовых полей вручную, но, поскольку я нахожусь в стадии обучения, я хотел исследовать, можно ли это сделать с помощью привязки данных. Таким образом, я буду знать различные способы ведения дел и могу строить свои концепции в процессе.
Я прилагаю свой код ниже. Это всего лишь тестовый проект с одним списком, имеющим один столбец.
XAML:
<Window.Resources>
<Prefs:Tables x:Key="TClass"></Prefs:Tables>
</Window.Resources>
<Grid>
<StackPanel Orientation="Horizontal">
<ListView Name="listView1" Background="Transparent" Height="534" BorderThickness="0 0 0 1" VerticalAlignment="Top">
<ListView.ItemsSource>
<Binding Source="{StaticResource TClass}" Path="Instance.dtAccounts" Mode="TwoWay"></Binding>
</ListView.ItemsSource>
<ListView.View>
<GridView x:Name="GridView1" ColumnHeaderContainerStyle="{StaticResource GridViewHeader}" AllowsColumnReorder="True">
<GridViewColumn Header="Company Name">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock x:Name="txbName" Padding="0 0 5 0" >
<TextBlock.Text>
<Binding Path="NAME">
</Binding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
<StackPanel Name="stkPanel1" Margin="100 0 0 0">
<TextBlock></TextBlock>
</StackPanel>
</StackPanel>
</Grid>
Window1.xaml.cs
public partial class Window1 : Window
{
DataTable dt = new DataTable();
public Window1()
{
InitializeComponent();
Tables.Instance.dtAccounts = Worker.LoadAccounts();
}
}
Класс Tables.cs
public class Tables : INotifyPropertyChanged
{
private static Tables instance;
public event PropertyChangedEventHandler PropertyChanged = delegate { };
private DataTable _dtAccounts;
public Tables()
{
}
// Singleton instance read-only property
public static Tables Instance
{
get
{
if (instance == null)
{
instance = new Tables();
}
return instance;
}
}
public DataTable dtAccounts
{
get
{
return _dtAccounts;
}
set
{
_dtAccounts = value;
OnPropertyChanged("dtAccounts");
}
}
private void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}
=====================
Окончательный рабочий код
Я смог сделать это с помощью ответа, предоставленного Филом. Размещение моего обновленного кода ниже, так как это может быть полезно для кого-то еще.
XAML:
<Grid>
<StackPanel Orientation="Horizontal">
<ListView Name="listView1" Background="Transparent" Height="534" BorderThickness="0 0 0 1" VerticalAlignment="Top" SelectionChanged="listView1_SelectionChanged">
<ListView.ItemsSource>
<Binding Source="{StaticResource TClass}" Path="Instance.dtAccounts" Mode="TwoWay"></Binding>
</ListView.ItemsSource>
<ListView.View>
<GridView x:Name="GridView1" ColumnHeaderContainerStyle="{StaticResource GridViewHeader}" AllowsColumnReorder="True">
<GridViewColumn Header="Company Name">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Name="txbName" Padding="0 0 5 0" >
<TextBlock.Text>
<Binding Path="NAME">
</Binding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
<StackPanel Name="stkPanel1" Margin="100 0 0 0">
<TextBlock>
<TextBlock.Text>
<Binding Source="{StaticResource TClass}" Path="Instance.SelectedName" Mode="TwoWay">
</Binding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</StackPanel>
</Grid>
Window1.xaml.cs
public partial class Window1 : Window
{
DataTable dt = new DataTable();
public Window1()
{
InitializeComponent();
Tables.Instance.dtAccounts = Worker.LoadAccounts();
}
private void listView1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListView lstView = sender as ListView;
int item = lstView.SelectedIndex;
Tables.Instance.SetSelectedRow(item);
}
}
Tables.cs
public class Tables : INotifyPropertyChanged
{
private static Tables instance;
public event PropertyChangedEventHandler PropertyChanged = delegate { };
private DataTable _dtAccounts;
private string _selectedName;
public Tables()
{
}
// Singleton instance read-only property
public static Tables Instance
{
get
{
if (instance == null)
{
instance = new Tables();
}
return instance;
}
}
public DataTable dtAccounts
{
get
{
return _dtAccounts;
}
set
{
_dtAccounts = value;
OnPropertyChanged("dtAccounts");
}
}
public string SelectedName
{
get
{
return _selectedName;
}
set
{
_selectedName = value;
OnPropertyChanged("SelectedName");
}
}
public void SetSelectedRow(int index)
{
int indexNo = index;
SelectedName = dtAccounts.Rows[index][0].ToString();
}
private void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}