У меня есть следующие требования:изменения данных отражается неправильно в родительском окне
- Показать
TreeView
пунктов - Показать подробную информацию о выбранном элементе в
TreeView
. - Диалог для редактирования выбранного элемента.
Я выполнил эти требования, но третий не делает то, что он должен делать, я застрял.
Что я хочу: Диалог редактирования должен иметь возможность редактировать элемент. Это не TreeViewItem
, а экземпляр одного из моих классов.
- Сохраните изменения - кнопка, которая только что закроет диалог.
- Отменить изменения - кнопка для сброса полей, измененных в элементе, и закрытия диалогового окна.
Второе требование не работает. Если я отредактирую поле и нажмите «Отмена», на панели сведений о деталях будут отображаться изменения. Я отлаживал, но обнаружил, что базовый элемент не изменился - однако элемент отображается с измененными значениями.
Код:
товара класс (категория)
public class Category { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual string Description { get; set; } public virtual Unit Unit { get; set; } public virtual List<Category> ChildCategories { get; set; } public virtual Category ParentCategory { get; set; } public virtual bool IsMainCategory { get; set; } public Category() { ChildCategories = new List<Category>(); } public virtual void AddChild(Category child) { ChildCategories.Add(child); child.ParentCategory = this; } }
товара (Категория) Подробности приведены в этикетке:
<DataTemplate DataType="{x:Type local:Category}"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="4*" SharedSizeGroup="a" /> <ColumnDefinition Width="6*" SharedSizeGroup="b" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="1*" /> <RowDefinition Height="1*" /> </Grid.RowDefinitions> <TextBlock Text="Name" Grid.Column="0" Grid.Row="0" Padding="5"/> <TextBlock Text="{Binding Path=Name}" Grid.Column="1" Grid.Row="0" Padding="5"/> <TextBlock Text="Description" Grid.Column="0" Grid.Row="1" Padding="5"/> <TextBlock Text="{Binding Path=Description}" Grid.Column="1" Grid.Row="1" Padding="5"/> </Grid> </DataTemplate>
обработчик событий для редактирования элемента в главном окне:
private void EditCategory(object sender, RoutedEventArgs e) { Category ctg = _tree.SelectedItem as Category; if (ctg != null) { CategoryDefineWindow cdw = new CategoryDefineWindow(); cdw.CategoryObject = ctg; cdw.ShowDialog(); } }
Item окно редактора XAML:
<Window x:Class="BSRCat.View.CategoryDefineWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="150" Width="500"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="3*" SharedSizeGroup="a" /> <ColumnDefinition Width="7*" SharedSizeGroup="b" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="1*" /> <RowDefinition Height="1*" /> <RowDefinition Height="1*" /> </Grid.RowDefinitions> <TextBlock Text="Name" Grid.Column="0" Grid.Row="0" Padding="5"/> <TextBox Text="{Binding Path=CategoryObject.Name, RelativeSource={RelativeSource AncestorType=Window}}" Grid.Column="1" Grid.Row="0" Padding="5"/> <TextBlock Text="Description" Grid.Column="0" Grid.Row="1" Padding="5"/> <TextBox Text="{Binding Path=CategoryObject.Description, RelativeSource={RelativeSource AncestorType=Window}}" Grid.Column="1" Grid.Row="1" Padding="5"/> <StackPanel Orientation="Horizontal" Grid.Row="2" Grid.ColumnSpan="2" HorizontalAlignment="Right"> <Button Content="Ok" Margin="5" Height="20" Width="30" Click="Confirmed"/> <Button Content="Cancel" Margin="5" Height="20" Width="50" Click="Cancelled"/> </StackPanel> </Grid> </Window>
Код продукта Окно редактора за:
public partial class CategoryDefineWindow : Window { public Category CategoryObject { get { return _category; } set { _category = value; _initial = new Category() { Name = value.Name, Description = value.Description }; } } private Category _category; private Category _initial; public CategoryDefineWindow() { InitializeComponent(); } private void Confirmed(object sender, RoutedEventArgs e) { Close(); } private void Cancelled(object sender, RoutedEventArgs e) { _category.Name = _initial.Name; _category.Description = _initial.Description; Close(); } }
Я отлажена метод CategoryDefineWindow.Cancelled
и объект _category
правильно сбросить. Я не могу найти, где это происходит.
Как панель сведений получает обновленные значения в первую очередь? Использует ли класс класса INotifyPropertyChanged? – Jefim
Просто примечание: я бы рекомендовал реализовать интерфейс ICloneable и в своем методе клонирования использовать метод object.MemberwiseClone(). Таким образом вам не нужен весь этот атрибут, копирующий материал, который является громоздким для реализации, когда число атрибутов, которое вам нужно копировать, увеличивается. – SvenG
@Jefim: я привязал свойство TreeView.SelectedItem к свойству Content. метка.С определением 'DataTemplate' я получаю панель сведений таким образом. – nakiya