我有一个名为SensorControl
的userControl,我想将其dataContext绑定到名为SensorModel
的viewModel类。
绑定成功,viewModel的初始值在userControl中可见,但问题是当我更改 viewModel的属性时, userControl不更新,我必须手动更新它(通过为其dataContext指定null并再次分配viewModel)。
这是我的代码的简化示例。
SensorControl.xml:
<UserControl ...[other attributes]... DataContext={Binding Model}>
.
.
.
<Label Content="{Binding Title}"/>
.
.
.
</UserControl>
SensorControl.xml.cs(代码隐藏):
public partial class SensorControl : UserControl
{
public SensorModel model;
public SensorModel Model
{
get { return model; }
set { model = value; }
}
public SensorControl(SensorModel sm)
{
Model = sm;
}
}
MainWindow.xml.cs:
public partial class MainWindow : Window
{
public SensorModel sensorModel_1;
public SensorControl sensorControl_1;
public MainWindow()
{
InitializeComponent();
sensorModel_1 = new SensorModel(...[some arguments]...);
sensorControl_1 = new SensorControl(sensorModel_1);
mainGrid.Children.Add(sensorControl_1);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
sensorModel_1.Title = "myTitle";
//The UserControl does not update
}
0)我在INotifyPropertyChanged
SensorModel
1)我需要这个的原因是,只有一个概念是传感器&#39;在我的项目中(它是一个真正的电子传感器),因此我有一个模型(处理真实传感器,数据库等),但在UI中我有多个userControls用于呈现传感器的不同方面。所以我必须为每个真实传感器创建一个模型实例(SensorModel),并且多个userControl必须绑定到它(每个都使用不同的模型部分)。
2)我对WPF并不陌生,但我是MVVM的新手,我可能会误解一些必要的东西,所以如果有人能清楚地解释一下,我会很感激。正确的做法。
提前致谢
答案 0 :(得分:1)
在UserControl中,删除DataContext属性并添加x:Name属性。然后在你的Label中,像这样绑定:
<UserControl x:Name="uc">
<Label Content="{Binding ElementName=uc,Path=Model.Title}" />
</UserControl>
我认为问题是DataContext无法设置为Model,因为绑定工作在父级的DataContext上,当它作为子节点添加到主格式时将基于mainGrid。由于物业&#34;模型&#34;在maiGrid的DataContext中不存在任何绑定都会发生,因此您的更新不会反映出来。正确获取UserControl的DataContext可能很棘手。我使用ElementName很多或在UserControl上创建DependencyProperties,然后从将使用该控件的父设置它们。
答案 1 :(得分:1)
您需要在View中将DataContext
设置为ViewModel类,如果您正在应用MVVM模式,则应使用ICommand进行操作。也许它会更好如果你实现了一个MainView类,它在后台而不是在MainWindow类中执行逻辑。
public MainWindow()
{
InitializeComponent();
DataContext = new MainView();
// sensorModel_1 = new SensorModel(...[some arguments]...);
// sensorControl_1 = new SensorControl(sensorModel_1);
// mainGrid.Children.Add(sensorControl_1);
}
您的MainView课程:
public class MainView {
public SensorControl Control {get; internal set;}
...
}
在你的xaml中更改绑定:
<Label Content="{Binding Control.Model.Title}"/>
答案 2 :(得分:1)
感谢你们所有人,我接受了你们的建议,最后我找到了办法。
1)我在SensorModel
中实施了一个事件,每当任何属性发生变化时都会触发(名称ModelChanged
)
2)然后作为Merve&amp; manOvision建议,我在SensorControl
(类型SensorModel
)中声明了一个依赖属性,并将ui元素绑定到那个(Binding Path=Model.Title
)
3)然后我在ModelChanged
中使用了此依赖项属性的SensorControl
事件并引发了一个事件(类型为INotifyPropertyChanged),以便绑定更新它们的值
工作正常。