C# WPF 来回绑定
C# WPF binding back and forth
我是 Wpf 中绑定的新手,我可能忽略了某些事情或以错误的方式处理它。
Map of my bindings
我有一个名为 Navigator(Controller) 的 class,它连接了 View(UI) 和 Service(DataProvider)。视图和服务唯一交换的是 Navigator 持有的 DataModel(CurrentData)。
public class Navigator : INotifyPropertyChanged
Singleton class 使用 Static I() 和 Instance() 获取实例
Binding myBinding = new Binding();
myBinding.Source = Navigator.I;
myBinding.Path = new PropertyPath("CurrentView");
myBinding.Mode = BindingMode.OneWay;
myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(MasterWindow.ViewFrame, Frame.ContentProperty, myBinding);
Binding myBinding2 = new Binding();
myBinding2.Source = Navigator.I;
myBinding2.Path = new PropertyPath("DataModel");
myBinding2.Mode = BindingMode.TwoWay;
myBinding2.BindsDirectlyToSource = true;
myBinding2.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(CurrentView, Page.DataContextProperty, myBinding2);
Binding myBinding11 = new Binding();
myBinding11.Source = Navigator.I;
myBinding11.Path = new PropertyPath("DataModel");
myBinding11.Mode = BindingMode.TwoWay;
myBinding11.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(ActiveService, UIService.ServiceModelProperty, myBinding11);
Binding myBinding10 = new Binding();
myBinding10.Source = Navigator.I.CurrentView;
myBinding10.Path = new PropertyPath("Title");
myBinding10.Mode = BindingMode.OneWay;
myBinding10.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
myBinding10.BindsDirectlyToSource = true;
BindingOperations.SetBinding(MasterWindow, Window.TitleProperty, myBinding10);
我在导航器中绑定的代码class
视图(页面)中的标题绑定到主机,主窗口标题。
Where it breaks is when the CurrentView is changed, the Title is stuck
to the first view set.
一个视图根据其使用的数据类型显示标题
<Page.Resources>
<conv:DataTypeToString x:Key="ToString"/>
</Page.Resources>
<Page.Title>
<Binding Path="DataType" Mode="OneWay" ConverterParameter="plural" Converter="{StaticResource ToString}"/>
</Page.Title>
当 CurrentView 发生变化时,Title 卡住了
到第一个视图集。
我在 Binding 上做错了,但找不到什么?
当您像这样设置绑定源时:
myBinding10.Source = Navigator.I.CurrentView;
那么绑定的源在任何时候都不是 "up to date" CurrentView
属性 下的任何内容,而是将源设置为那个 属性 在执行该行的时刻。因此,即使 属性 值以后可能会发生变化,来源将保持不变,并且标题不会改变。为了使绑定框架也 "track" 更改为 CurrentView
属性(除了 Title
属性),您应该将其作为路径的一部分,而不是来源。所以这应该可以解决您的问题:
myBinding10.Source = Navigator.I;
myBinding10.Path = new PropertyPath("CurrentView.Title");
现在,每当 CurrentView
发生变化或它的当前值 Title
发生变化时,它都会反映在您的 UI 中。
我是 Wpf 中绑定的新手,我可能忽略了某些事情或以错误的方式处理它。
Map of my bindings
我有一个名为 Navigator(Controller) 的 class,它连接了 View(UI) 和 Service(DataProvider)。视图和服务唯一交换的是 Navigator 持有的 DataModel(CurrentData)。
public class Navigator : INotifyPropertyChanged
Singleton class 使用 Static I() 和 Instance() 获取实例
Binding myBinding = new Binding();
myBinding.Source = Navigator.I;
myBinding.Path = new PropertyPath("CurrentView");
myBinding.Mode = BindingMode.OneWay;
myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(MasterWindow.ViewFrame, Frame.ContentProperty, myBinding);
Binding myBinding2 = new Binding();
myBinding2.Source = Navigator.I;
myBinding2.Path = new PropertyPath("DataModel");
myBinding2.Mode = BindingMode.TwoWay;
myBinding2.BindsDirectlyToSource = true;
myBinding2.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(CurrentView, Page.DataContextProperty, myBinding2);
Binding myBinding11 = new Binding();
myBinding11.Source = Navigator.I;
myBinding11.Path = new PropertyPath("DataModel");
myBinding11.Mode = BindingMode.TwoWay;
myBinding11.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(ActiveService, UIService.ServiceModelProperty, myBinding11);
Binding myBinding10 = new Binding();
myBinding10.Source = Navigator.I.CurrentView;
myBinding10.Path = new PropertyPath("Title");
myBinding10.Mode = BindingMode.OneWay;
myBinding10.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
myBinding10.BindsDirectlyToSource = true;
BindingOperations.SetBinding(MasterWindow, Window.TitleProperty, myBinding10);
我在导航器中绑定的代码class
视图(页面)中的标题绑定到主机,主窗口标题。
Where it breaks is when the CurrentView is changed, the Title is stuck to the first view set.
一个视图根据其使用的数据类型显示标题
<Page.Resources>
<conv:DataTypeToString x:Key="ToString"/>
</Page.Resources>
<Page.Title>
<Binding Path="DataType" Mode="OneWay" ConverterParameter="plural" Converter="{StaticResource ToString}"/>
</Page.Title>
当 CurrentView 发生变化时,Title 卡住了 到第一个视图集。
我在 Binding 上做错了,但找不到什么?
当您像这样设置绑定源时:
myBinding10.Source = Navigator.I.CurrentView;
那么绑定的源在任何时候都不是 "up to date" CurrentView
属性 下的任何内容,而是将源设置为那个 属性 在执行该行的时刻。因此,即使 属性 值以后可能会发生变化,来源将保持不变,并且标题不会改变。为了使绑定框架也 "track" 更改为 CurrentView
属性(除了 Title
属性),您应该将其作为路径的一部分,而不是来源。所以这应该可以解决您的问题:
myBinding10.Source = Navigator.I;
myBinding10.Path = new PropertyPath("CurrentView.Title");
现在,每当 CurrentView
发生变化或它的当前值 Title
发生变化时,它都会反映在您的 UI 中。