【问题标题】:iNotify: int from Code, String to XAML [closed]iNotify:从代码,字符串到 XAML 的 int [关闭]
【发布时间】:2017-08-11 15:21:11
【问题描述】:

我有一个 iNotifyChange 属性绑定到我的 XAML 中的标头。我想要的是从后面的代码中能够更新一个 int 值但将字符串返回到 XAML。 IE。代码将属性更新为 6,XAML 更新为“警告:6”。问题是属性的类型不能与其返回类型不同。我应该如何修改以下内容以使其正常工作?

<Expander Header="{Binding Path=DATErrorsHeader, UpdateSourceTrigger=PropertyChanged}">

private int _overallError;
public string ErrorsWarningsHeader
{
    get { return "Warnings: " + _overallError.ToString(); }
    set
    {
        int.TryParse(value, out _overallError);
        NotifyPropertyChanged();
    }
}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
    var handler = PropertyChanged;
    if (handler != null)
        handler(this, new PropertyChangedEventArgs(propertyName));
}

在代码中我基本上是在做;

viewModel.ErrorsWarningsHeader = "6";

我宁愿这是一个 int,以便我可以添加到属性的当前值。

【问题讨论】:

  • "但是将字符串返回到 XAML" -- 为什么?如有必要,WPF 会为您将int 转换为string。那么你遇到了什么问题呢?
  • @PeterDuniho 所以我希望能够在后面的代码中说 myProperty = myProperty + 1 (即一个 int)但返回给 XAML 的值是“一些文本:”+ myProperty (即一个字符串)。

标签: c# inotifypropertychanged


【解决方案1】:

您可以添加由您的类中的同一字段支持的不同数据类型的另一个属性。

public int ErrorsWarningsHeaderInt
{
    get { return _overallError; }
    set
    {
        // TODO: Validation of 'value'
        _overallError = value;
        NotifyPropertyChanged(nameof(ErrorsWarningsHeader));
    }
}

【讨论】:

  • 谢谢你,最后一个问题;假设我有一堆这些属性都连接到它们各自的元素。但是我还有另一个 Header 旨在显示所有其他值的总和,我应该在什么时候将每个值添加到该属性中?在 NotifyPropertyChanged 中?
  • 我不太确定我是否理解您的评论...由于此属性 与 UI 中的绑定字段共享相同的支持字段,因此您的除了您必须访问代码/代码行为中的 ErrorsWarningHeaderInt 和 XAML 中的 ErrorsWarningHeader 之外的代码
【解决方案2】:

这是编写自己的Converter 的好案例。您可以创建一个继承自IValueConverterclass 并实现Convert 方法。

一旦你有了这个,将命名空间导入到你的xaml,你可以在你的xaml中像下面这样:

<TextBlock Text = "{Binding WarningNumber//your int prop name, 
Converter = {StaticResource WarningNumberToDisplayMsgConverter //name of your converter type}}"

【讨论】:

  • 似乎是个好建议。但是,我实际上将其应用于大约 10 个 XAML 元素。我的转换器在显示名称开头添加的字符串(在此示例中为“警告:”)对于每个元素都会有所不同,这意味着我需要为每个元素使用不同的转换器(因为 afaik 你不能传递参数从 XAML 返回)。除非我对调用转换器的元素进行一些挑剔,否则可能会根据元素名称选择字符串...??想法?
  • Convert 方法的第三个参数采用对象参数,您可以将 xaml 中的值发送到该参数。根据您的控件,将您想要的前缀作为参数发送,在方法中发挥您的作用,然后返回显示字符串。自从我完成 xaml 以来已经有一段时间了,但我认为这应该会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 2010-10-18
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
相关资源
最近更新 更多