同时使用同一用户控件的多个实例
Using multiple instances of same user control simultaneously
我正在使用 wpf 和 MVVM 创建一个应用程序。我 运行 遇到一个问题,其中一个控件同时使用另一个控件的三个副本。这三个都需要有自己的相关视图模型实例。目前我在用户控件的视图中有与视图模型相关的绑定,但我没有在其自己的 xaml.
中设置控件的数据上下文
我不记得我是在哪里看到这个的,但我最初的尝试是像这样使用一个可观察的集合:
在模型中:
private ObservableCollection<SignalStrengthViewModel> signalStrengths;
public GyroViewModel()
{
this.signalStrengths = new ObservableCollection<SignalStrengthViewModel>();
this.signalStrengths.Add(new SignalStrengthViewModel(Color.FromRgb(0, 128, 255)));
this.signalStrengths.Add(new SignalStrengthViewModel(Color.FromRgb(63, 163, 153)));
this.signalStrengths.Add(new SignalStrengthViewModel(Color.FromRgb(121, 132, 196)));
}
和包含控件的xaml:
<controls:SignalStrengthUserControl x:Name="Link1SignalStrengthControl" DataContext="{Binding SignalStrengths[0], Mode=OneWayToSource}"/>
<controls:SignalStrengthUserControl x:Name="Link2SignalStrengthControl" DataContext="{Binding SignalStrengths[1], Mode=OneWayToSource}"/>
<controls:SignalStrengthUserControl x:Name="Link3SignalStrengthControl" DataContext="{Binding SignalStrengths[2], Mode=OneWayToSource}"/>
这似乎并没有真正将控件的实例与视图模型的实例绑定在一起。我还尝试将列表移动到包含控件 xaml 的代码后面,结果没有变化。
谁能告诉我我做错了什么?
我在这里和其他地方看到了使用文本框数据模板的问题,但我还没有找到一种方法来使它在此处起作用(它们都是针对文本框的)。
我看过的其他一些问题:
A SIMPLE PATTERN FOR CREATING RE-USEABLE USERCONTROLS IN WPF / SILVERLIGHT
Multiple instances of a wpf user control all use the same viewmodel
您绑定的 Mode
设置不正确,它们应该是 OneWay
。 OneWayToSource
用于将数据从 "target" 元素移回绑定源,几乎与您正在尝试做的完全相反。
可以在 MSDN 上找到有关每个 BindingMode
的更多详细信息。
我正在使用 wpf 和 MVVM 创建一个应用程序。我 运行 遇到一个问题,其中一个控件同时使用另一个控件的三个副本。这三个都需要有自己的相关视图模型实例。目前我在用户控件的视图中有与视图模型相关的绑定,但我没有在其自己的 xaml.
中设置控件的数据上下文我不记得我是在哪里看到这个的,但我最初的尝试是像这样使用一个可观察的集合: 在模型中:
private ObservableCollection<SignalStrengthViewModel> signalStrengths;
public GyroViewModel()
{
this.signalStrengths = new ObservableCollection<SignalStrengthViewModel>();
this.signalStrengths.Add(new SignalStrengthViewModel(Color.FromRgb(0, 128, 255)));
this.signalStrengths.Add(new SignalStrengthViewModel(Color.FromRgb(63, 163, 153)));
this.signalStrengths.Add(new SignalStrengthViewModel(Color.FromRgb(121, 132, 196)));
}
和包含控件的xaml:
<controls:SignalStrengthUserControl x:Name="Link1SignalStrengthControl" DataContext="{Binding SignalStrengths[0], Mode=OneWayToSource}"/>
<controls:SignalStrengthUserControl x:Name="Link2SignalStrengthControl" DataContext="{Binding SignalStrengths[1], Mode=OneWayToSource}"/>
<controls:SignalStrengthUserControl x:Name="Link3SignalStrengthControl" DataContext="{Binding SignalStrengths[2], Mode=OneWayToSource}"/>
这似乎并没有真正将控件的实例与视图模型的实例绑定在一起。我还尝试将列表移动到包含控件 xaml 的代码后面,结果没有变化。
谁能告诉我我做错了什么?
我在这里和其他地方看到了使用文本框数据模板的问题,但我还没有找到一种方法来使它在此处起作用(它们都是针对文本框的)。
我看过的其他一些问题:
A SIMPLE PATTERN FOR CREATING RE-USEABLE USERCONTROLS IN WPF / SILVERLIGHT Multiple instances of a wpf user control all use the same viewmodel
您绑定的 Mode
设置不正确,它们应该是 OneWay
。 OneWayToSource
用于将数据从 "target" 元素移回绑定源,几乎与您正在尝试做的完全相反。
可以在 MSDN 上找到有关每个 BindingMode
的更多详细信息。