我的ViewModel中有两个公共属性Foo
和Bar
。 Foo
只是一个字符串,Bar
是一个具有公共属性Name
的字符串。
我想将Bar.Name
绑定到某个GUI元素。 我该怎么做?
<Label Content="{Binding Foo}">
按预期将字符串Foo
写入标签。
但是<Label Content="{Binding Bar.Name}">
没有将Bar
的名称写入标签。相反,标签保持空白。
编辑:
我的XAML的DataContext
(以及Label的{1}}设置为ViewModel。
EDIT2:当然,真正的代码并不像上面描述的那么简单。我构建了一个仅代表上述描述的最小工作示例:
XAML:
<Window x:Class="MyTestNamespace.MyXAML"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
<StackPanel>
<Label Content="{Binding Foo}"></Label>
<Label Content="{Binding Bar.Name}"></Label> <!-- Works fine! -->
</StackPanel>
</Window>
视图模型:
namespace MyTestNamespace
{
class MyVM
{
public string Foo { get; set; }
public MyBar Bar { get; set; }
public MyVM()
{
Foo = "I am Foo.";
Bar = new MyBar("I am Bar's name.");
}
}
class MyBar
{
public string Name { get; set; }
public MyBar(string text)
{
Name = text;
}
}
}
这实际上是按预期工作的。由于我无法与您分享实际代码(太多并且由公司拥有),我需要自己搜索原因。欢迎任何有关可能原因的提示!
答案 0 :(得分:0)
1.Your Model.cs:
public class Model : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
PropertyChanged(this, new PropertyChangedEventArgs("Name"));
}
}
public event PropertyChangedEventHandler PropertyChanged = delegate { };
}
2.您的ViewModel:
public MainViewModel()
{
_model = new Model {Name = "Prop Name" };
}
private Model _model;
public Model Model
{
get
{
return _model;
}
set
{
_model = value;
}
}
3.您的View,将DataContext设置为ViewModel:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow"
DataContext="{StaticResource MainViewModel}">
<Grid>
<Label Content="{Binding Model.Name}"/>
</Grid>
答案 1 :(得分:0)
感谢Vignesh N。的评论,我能够解决问题。
在实际代码中Bar
可以更改,但在开始时它的名称是空字符串。这是Label打开窗口时显示的内容。由于Label
属性更改时未通知Bar
,因此不会更新。
解决方案:让ViewModel实现INotifyPropertyChanged
接口并定义Bar
,如下所示:
private MyBar _bar;
public MyBar Bar
{
get
{
return _bar;
}
set
{
if (_bar != value)
{
_bar = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Bar)));
}
}
}