Wpf + Caliburn Micro:绑定文本框到自定义对象

本文关键字:自定义 对象 文本 绑定 Caliburn Micro Wpf | 更新日期: 2023-09-27 18:15:57

我使用Wpf 4.5和Caliburn Micro 2.0.2。

我想绑定一个文本框到视图模型的属性。属性(称为ResultData)是来自类TextXmlData的对象。该类是从xsd自动生成的。我用微软的Xsd.exe制作。

这是视图模型

public class ShellViewModel : PropertyChangedBase, IHaveDisplayName
{
    public string DisplayName { get; set; }
    private TestXmlData _resultData;
    public TestXmlData ResultData
    {
        get { return _resultData; }
        set
        {
            _resultData = value;
            NotifyOfPropertyChange(() => _resultData);
        }
    }
    public ShellViewModel()
    {
        DisplayName = "Shell Window";
    }
    public void CreateObject()
    {
        String xmlData = "<TestXmlData><Id>88</Id><Name>What a name</Name></TestXmlData>";
        if (ResultData == null) { ResultData = new TestXmlData(); }
        XmlSerializer oXmlSerializer = new XmlSerializer(ResultData.GetType());
        ResultData = (TestXmlData)oXmlSerializer.Deserialize(new StringReader(xmlData)); 
        // at this point the debugger shows that the ResultData is correctly filled, 
        // the Name is definitely not empty
    }
}

这是视图

<UserControl x:Class="CMWpfXmlSerializer2Ways.Views.ShellView"
         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"
         d:DesignHeight="300"
         d:DesignWidth="300"
         mc:Ignorable="d">
<Grid Width="300" Height="300">
    <StackPanel Width="200"
                Height="100"
                HorizontalAlignment="Center"
                VerticalAlignment="Center">
        <Button x:Name="CreateObject"
                Width="190"
                Content="Create Object from XML" />
        <TextBox Width="190"
                 DataContext="{Binding ResultData}"
                 Text="{Binding Name}" />
    </StackPanel>
</Grid>
</UserControl>

和文本框总是显示为空!

我也尝试过Text="{Binding ResultData。

文本框显示为空。

有谁可以帮助我,告诉我上面的代码有什么问题吗?请随意修改代码。

Wpf + Caliburn Micro:绑定文本框到自定义对象

ResultData是ViewModel的一个属性。所以,你需要在更高的层次设置ViewModel为DataContext,然后你可以在更低的层次使用它的属性作为绑定源。

为了运行您的示例,我做了一些更改并运行如下:

<TextBox x:Name="tbName" DataContext="{Binding ResultData}" Text="{Binding Name}" />

///

public partial class MainWindow : Window
{
    public MainWindow()
    {  
        InitializeComponent();
        ShellViewModel vm = new ShellViewModel();
        vm.CreateObject();
        this.DataContext = vm;
    } 
    ...

///

public class ShellViewModel : INotifyPropertyChanged
    {
        public string DisplayName { get; set; }
        private TestXmlData _resultData;
        public TestXmlData ResultData
        {
            get { return _resultData; }
            set
            {
                _resultData = value;
                OnPropertyChanged("ResultData");
            }
        }
        public void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
        public ShellViewModel()
        {
            DisplayName = "Shell Window";
        }
        public void CreateObject()
        {
            String xmlData = "<TestXmlData><Id>88</Id><Name>What a name</Name></TestXmlData>";
            if (ResultData == null) { ResultData = new TestXmlData(); }
            XmlSerializer oXmlSerializer = new XmlSerializer(ResultData.GetType());
            ResultData = (TestXmlData)oXmlSerializer.Deserialize(new StringReader(xmlData));
            // at this point the debugger shows that the ResultData is correctly filled, 
            // the Name is definitely not empty
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }

是否启用了calibre . micro的调试功能?这将从你的BootStrapper完成。这将告诉我们视图和视图模型是否被正确绑定。

通常放在引导程序的CTOR中LogManager。GetLog = type => new DebugLog(type);

既然你正在使用UserControl为你的shellview我想看到你的BootStrapper

我怀疑有一些地方不正确,或者名称空间设置不正确,这会导致绑定错误。

在我一遍又一遍地阅读你的评论,提示,建议和我的代码之后,我偶然发现了问题的原因。这是我自己的错误(是的,我愚蠢的错误)

我使用了后备字段_resultData在NotifyOfPropertyChange而不是属性名称ResultData!(请参见视图模型中ResultData属性的setter)

非常感谢大家!