【问题标题】:Bind string[] to XAML using TwoWay使用 TwoWay 将 string[] 绑定到 XAML
【发布时间】:2015-11-04 16:41:55
【问题描述】:

我有一个模型,我收到一个名为birth 的属性,格式为这种格式

birthday, birthplace

我已经在模型中设置了这个

private string _birth;
/// <summary>
/// Birth information in format: birthday, birthplace
/// </summary>
[Column("birth")]
[JsonProperty("birth")]
public string Birth
{
    get { return this._birth; }
    set
    {
        this._birth= value;
        OnPropertyChanged();
        OnPropertyChanged("BirthData");
    }
}

我还设置了一个这样的公共modifier

    /// <summary>
    /// Split the birth data if exists
    /// </summary>
    public string[] BirthData
    {
        get { return this.Birth?.Split(',');  }
    }

在我的 XAML 文件中,我已经为我的模型正确设置了所有内容,除了我无法理解如何在这样的东西上使用 TwoWay 绑定。您将在下面找到此特定属性的 XAML 摘录

<Label x:Name="BirthdayLabel" Content="Nato Il" />
<DatePicker x:Name="BirthdayDateTimePicker" SelectedDate="{Binding selectedModel.BirthData[0], Mode=TwoWay}"></DatePicker>
<Label x:Name="BirthplaceLabel" Content="Nato A"/>
<TextBox x:Name="BirthplaceTextBox" Text="{Binding selectedModel.BirthData[1], Mode=TwoWay}"/>

当然这不能正常工作,因为即使绑定按预期工作,我也会使用有关属性的旧信息得到selectedModel,我认为 TwoWay 绑定不适用于数据数组像这样。

我无法更改 DataSource,我必须找到一种方法来使用一个文本框和一个日期选择器,并在我的 ViewModel 中一起使用,除了一个名为 Update() 的方法之外,它没有太多功能,它采用当前 selectedModel .

【问题讨论】:

  • 您是否考虑过在 Birth 上使用 validation 属性?
  • @MikeEason 我正在学习 WPF 和 MVVM 模式,你能链接我一些资源或向我解释一下验证属性是什么意思吗?
  • Here 你去吧。你可以绑定到Birth(上面会有一些验证属性),如果用户输入任何错误,你可以简单地弹出该消息。
  • @MikeEason 谢谢,所以删除了BirthData 属性,而是使用Birth + 验证。老实说,这很好:-) 荣誉
  • @Claudio,你想要双向绑定,对。验证很有趣,但这不是你的问题,对吧?

标签: c# wpf mvvm data-binding


【解决方案1】:

ViewModel 是为视图准备数据

所以我建议你在 View Model 中拆分和解析数据,并为 BirthDateBirthPlace 公开两个属性:

class Person
{
    private string _birth;
    public string Birth{
        get { return this._birth; }
        set
        {
            this._birth = value;
            SplitBirthIntoBirthDayAndBirthPlace();
            OnPropertyChanged();
        }
    }
    private DateTime _birthday;
    public DateTime Birthday{
        get { return _birthday; }
        set
        {
            _birthday = value;
            ReComputeBirth();
            OnPropertyChanged();
        }
    }
    // Same for Birthplace ...
    private void ReComputeBirth(){
        // ... Format the data as expected ...
        _birth = _birthday + ", " + _birthplace;
    }
    private void SplitBirthIntoBirthDayAndBirthPlace()
    {
        String[] values = _birth.Split(',', ' ');
        // ... really make the parse here to fill _birthplace and _birthdate...
    }
    // ....
}

而且绑定更简单:

    <DatePicker x:Name="BirthdayDateTimePicker"
                SelectedDate="{Binding selectedModel.Birthday, Mode=TwoWay}"/>

    <TextBox x:Name="BirthplaceTextBox"
             Text="{Binding selectedModel.Birthplace, Mode=TwoWay}"/>

【讨论】:

  • 你是巫师吗?开玩笑,这个解决方案似乎比验证更适合我的问题,出生地在哪里?
  • Grazie,非“巫师”。我只是重复一下,ViewModel 只是为 GUI 准备数据,并公开属性。
  • 我明白了,我正在尝试以“正确的方式”学习 MVVM,而这个挑战让我发疯,感谢您的帮助。我正在根据您的回答实施解决方案。
  • @Emmanuek DURIN 这个解决方案既时尚又酷。你能给我推荐书籍/网站/博客/视频以正确的方式学习 MVVM 吗?
  • 我只有一本书可以推荐“Programming WPF: Chris Sells, Ian Griffiths”,这是一本非常厚实、完整的书——值得阅读的参考书。你不必通读。有一些非常高级的主题。但是一切都很好地解释了。尽管数据绑定页面很好,但没有关于 MVVM 的部分。
猜你喜欢
  • 1970-01-01
  • 2015-03-14
  • 2023-04-10
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多