#c# #wpf #data-binding #wpfdatagrid
#c# #wpf #привязка данных #wpfdatagrid
Вопрос:
Я просто поиграл с WPF, и у меня возникла проблема с привязкой данных…
Вот мой код на данный момент…
Окно XAML:
<Window x:Class="FRC.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Registry Cleaner - By Martin Milan." MinHeight ="350" Height ="350" MinWidth="525" MaxHeight="700" Width="350" Background="#FFC199AA" >
<DockPanel Background="#FFD9E1E8" Margin="10">
<Grid DockPanel.Dock="Top" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<Label Grid.Column="0" Grid.Row="0" HorizontalAlignment="Right" >Filepath:</Label>
<TextBox Grid.Column="1" HorizontalAlignment="Stretch" Name="txtFilePath" VerticalAlignment="Stretch" />
</Grid>
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" HorizontalAlignment="Right" >
<Button Name="butScan" Content="Scan" MinWidth="75" Margin="0,0,10,5" />
<Button Name="butDelete" Content="Remove RegKeys" Margin="0,0,5,5" Click="butDelete_Click" />
</StackPanel>
<ScrollViewer Margin="0,0,0,5">
<DataGrid AutoGenerateColumns="False" Name="dgActions" CanUserAddRows="False" CanUserDeleteRows="False" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding RegKeyPath, Mode=OneWay}" Header="Registry Key" Width="*"/>
<DataGridCheckBoxColumn Binding="{Binding DeletePath, Mode=TwoWay}" Header="Can I delete key?"
MinWidth="110" Width="110" />
</DataGrid.Columns>
</DataGrid>
</ScrollViewer>
</DockPanel>
</Window>
Код, лежащий в основе окна:
namespace FRC
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
protected List<RegistryAction> mRegistryActions = new List<RegistryAction>();
public MainWindow()
{
InitializeComponent();
RegistryAction oRegAction = new RegistryAction();
oRegAction.DeletePath = true;
oRegAction.RegKeyPath = "A test value";
mRegistryActions.Add (oRegAction);
dgActions.DataContext = mRegistryActions;
dgActions.ItemsSource = mRegistryActions;
}
private void butDelete_Click(object sender, RoutedEventArgs e)
{
RegistryAction oRegAction = new RegistryAction();
oRegAction.DeletePath = true;
Random rGen = new Random();
oRegAction.RegKeyPath = "A test " rGen.Next(100).ToString();
mRegistryActions.Add(oRegAction);
}
}
}
Класс RegistryAction:
namespace FRC
{
public class RegistryAction
{
public string RegKeyPath { get; set; }
public bool DeletePath { get; set; }
public RegistryAction()
{
this.DeletePath = false;
this.RegKeyPath = "";
}
}
}
В принципе. он настраивает список объектов RegistryAction и связывает его с DataGrid. Однако я обнаружил, что всякий раз, когда я запускаю код в butDelete_Click, хотя список обновляется, содержимое в сетке не обновляется.
Короче говоря, кто-нибудь может указать, что я пропустил, пожалуйста?
Мартин.
Ответ №1:
mRegistryActions
должно быть ObservableCollection
:
protected ObservableCollection<RegistryAction> mRegistryActions = new ObservableCollection<RegistryAction>();
Комментарии:
1. Это полностью решило проблему одним махом — приветствую. Следовало бы подумать, что если сетка не слышит об изменениях в коллекции, то, возможно, коллекция не кричит о них. 1 и принимаем.
Ответ №2:
У вас должна быть RegistryAction
реализация INotifyPropertyChanged
. В MSDN также есть практическое руководство по этому вопросу.
Комментарии:
1. 1 — Приветствия … Также потребуется INotifyCollectionCHange в списке<T>, который, конечно, я всегда мог бы подклассировать…