我的解决方案中有三个项目:
在我的MainWindow中,我想将UserControl与UIProcess的ViewModel一起使用。
首先我在我的 MainWindow 中设置UserControl:
<TabItem Header="Editor">
<Grid>
<cel:ConfigEditorView DataContext="{Binding ConfEditModel, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
</TabItem>
我不知道这里需要哪些属性,所以我把它们放在一起,但它仍然不起作用。
然后我在 MainViewModel 中设置了它:
public ConfigEditorViewModel ConfEditModel { get; set; }
使用绑定到Button的简单方法:
private void doSomething()
{
ConfEditModel = new ConfigEditorViewModel("Hello World");
}
我的 ConfigEditorViewModel 看起来基本上是这样的:
public class ConfigEditorViewModel : ViewModelBase
{
private string _Description;
public string Description
{
get
{
return _Description;
}
set
{
_Description = value;
base.RaisePropertyChanged();
}
}
public ConfigEditorViewModel(string t)
{
Description = t;
}
}
描述绑定到UserControl中的TextBox。
<TextBox Grid.Row="1" Grid.Column="1" Margin="0,0,0,10" Text="{Binding Description}"/>
当我启动应用程序并单击按钮时,TextBox应该包含“Hello World”但它是空的。
我做错了什么?
答案 0 :(得分:2)
我给了你一个通用答案:
在“real(一个用户控件,你想要使用具有不同属性名称的不同视图模型)”“usercontrol你绑定到你自己的DependencyProperties ,你用 ElementName或RelativeSource binding < / strong>你应该永远不要在UserControl中设置DataContext 。
<UserControl x:Name="myRealUC" x:class="MyUserControl">
<TextBox Text="{Binding ElementName=myRealUC, Path=MyOwnDPIDeclaredInMyUc, Path=TwoWay}"/>
<UserControl>
如果您这样做,您可以在任何视图中轻松使用此Usercontrol,如:
<myControls:MyUserControl MyOwnDPIDeclaredInMyUc="{Binding MyPropertyInMyViewmodel}"/>
和完整性:依赖属性
public readonly static DependencyProperty MyOwnDPIDeclaredInMyUcProperty = DependencyProperty.Register(
"MyOwnDPIDeclaredInMyUc", typeof(string), typeof(MyUserControl), new PropertyMetadata(""));
public bool MyOwnDPIDeclaredInMyUc
{
get { return (string)GetValue(MyOwnDPIDeclaredInMyUcProperty); }
set { SetValue(MyOwnDPIDeclaredInMyUcProperty, value); }
}
答案 1 :(得分:1)
您的视图模型(以及可选的模型)需要实现INotifyPropertyChanged。
绑定不是魔术。没有内置机制允许在普通旧属性的值发生更改时通知代码。您必须轮询它以检查是否发生了变化,这在性能方面会非常糟糕。
因此绑定会查看它们绑定的对象,看看它们是否实现了INotifyPropertyChanged,如果是,则会订阅PropertyChanged事件。这样,当您更改属性并触发事件时,将通知绑定并更新UI。
警告,您必须实现界面并正确使用它。 This example says it's for 2010,但它运作正常。