using Common.Models; using MegaRobo.C00225155App.MenuViewModels; using MegaRobo.C00225155App.MenuViews.Bottles; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; namespace MegaRobo.C00225155App.MenuViews { /// /// BottleUserControl.xaml 的交互逻辑 /// public partial class SampleBottleUserControl : UserControl { //UserControl 的 DataContext 并未设置,而是通过 SampleBottleModel 依赖属性传递数据 public SampleBottleModel SampleBottleModel { get { return (SampleBottleModel)GetValue(SampleBottleModelProperty); } set { SetValue(SampleBottleModelProperty, value); } } // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc... public static readonly DependencyProperty SampleBottleModelProperty = DependencyProperty.Register( "SampleBottleModel", typeof(SampleBottleModel), typeof(SampleBottleUserControl), new PropertyMetadata(null, OnSampleBottleModelChanged)// 重要:默认值设为 nullKD ); public SampleBottleUserControl() { InitializeComponent(); } private static void OnSampleBottleModelChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = (SampleBottleUserControl)d; control.InvalidateVisual();//强制重绘 var ctIndicator = control.FindName("MyCTIndicator") as CTIndicator; // 需给 CTIndicator 命名 if (ctIndicator != null) { ctIndicator.ForceRefresh(); // 手动更新CTValue绑定(双重保障) BindingOperations.GetBindingExpression( ctIndicator, CTIndicator.CTValueProperty )?.UpdateTarget(); } } private void Bottle_MouseLeft_old(object sender, MouseButtonEventArgs e) { //var originalModel = this.ReactBottleModel; // 保存原始模型引用 var viewModel = new EditSampleBottlePropertiesViewModel { SampleBottle = this.SampleBottleModel }; var editWindow = new EditSampleBottlePropertiesWindow { DataContext = viewModel }; // 显示编辑属性窗口并等待用户操作 if (editWindow.ShowDialog() == true) { Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => { // 更新自定义控件的属性 viewModel = (EditSampleBottlePropertiesViewModel)editWindow.DataContext; var ctIndicator = this.FindName("MyCTIndicator") as CTIndicator; // 需给 CTIndicator 命名 if (ctIndicator != null) { ctIndicator.ForceRefresh(); } })); } e.Handled = true; } private void Bottle_MouseLeft(object sender, MouseButtonEventArgs e) { // 初始化编辑视图模型 SampleBottleType var viewModel = new EditSampleBottlePropertiesViewModel { SampleBottle = this.SampleBottleModel // 传递当前模型 }; var editWindow = new EditSampleBottlePropertiesWindow { DataContext = viewModel }; // 显示编辑窗口并处理结果 if (editWindow.ShowDialog() == true) { // 低优先级执行刷新,确保编辑事务已释放 Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => { // 处理父视图的编辑事务(关键) var parentView = CollectionViewSource.GetDefaultView(this.DataContext) as ListCollectionView; if (parentView != null) { if (parentView.IsEditingItem) parentView.CommitEdit(); if (parentView.IsAddingNew) parentView.CommitNew(); } // 刷新 CTIndicator 控件 var ctIndicator = this.FindName("MyCTIndicator") as CTIndicator; if (ctIndicator != null) { //ctIndicator.SampleBottle = viewModel.SampleBottle; ctIndicator.ForceRefresh(); } })); } // 释放窗口资源 editWindow.DataContext = null; editWindow.Close(); e.Handled = true; } } }