【问题标题】:How flexible is DataBinding in WPF?WPF 中的 DataBinding 有多灵活?
【发布时间】:2011-07-05 04:37:12
【问题描述】:

WPF 中的 DataBinding 有多灵活?一世 我是 WPF 新手,想拥有一个 明确的想法。我可以绑定一个字符串吗 带有 Slider 值的变量?可以 总是必须是一个控件?

是否可以绑定字符串 带有滑块控件的值,以便它 实时更新?多远 逻辑树进行更新或 我们是否必须重新发出所有命令 使用这个新值?

这是我之前匆忙提出的问题。我正在发布一个详细的问题。

我想要做的是,我有一个包含多个用户控件的应用程序。这些用户控件是网格视图,包含控件(文本框、按钮)和我的应用程序 UI 的部分。我使用这种方法将我的主 XAML 文件拆分为多个文件,并且它对我来说直到现在都有效。现在,我在一个用户控件中有一个 Slider,并希望在另一个用户控件中绑定一个 String 变量。字符串变量是只读的,所以双向绑定没有用处。

我希望这能说明我的问题。在我的代码中,我试图在以下位置更新变量 zoomFactor:

URLQuery.Append("&zoom=" + zoomFactor + "&size=600x500&format=jpg&sensor=false");

带有滑块控件。对于那些可以发现的人,是的,它是 Google 静态地图 API,是的,我正在尝试使用滑块放大地图。

【问题讨论】:

  • 我不知道您是否解决了这个问题,但是您应该如何更改只读属性?为什么它是只读的?你想改变它 - 然后不要让它只读!

标签: c# wpf data-binding


【解决方案1】:

您通常可以使用IValueConverter 来执行此类操作。

当您创建适当的转换器时,您可以指定将其用于 XAML 中的绑定。

对于“实时”部分,只要您在 DataContext 对象中正确实现 INotifyPropertyChanged,修改变量将反映在 UI 上,应用您决定的所有值转换器。让我们举一个使用滑块的示例你说:

<Window x:Class="Example.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Example"
        Title="MainWindow" Height="350" Width="525"
        >
    <Window.Resources>
        <local:HMLConverter x:Key="hiloConverter"></local:HMLConverter>
    </Window.Resources>
    <Slider Value="{Binding MyValue, Converter={StaticResource hiloConverter}}"  Maximum="100" Minimum="0"/>
</Window>

我创建了一个名为 HMLConverter 的小转换器,它将一个字符串变量映射到相应的“lo”、“med”、ang“hi”字符串的值 0-50-100。转换器被声明为静态资源,并在绑定中使用。转换器代码如下:

namespace Example
{
    public class HMLConverter:IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string val = value.ToString();
            int ret = 0;
            switch (val.ToLower())
            {
                case "hi":
                    ret = 100;
                    break;
                case "lo":
                    ret = 0;
                    break;
                case "med":
                    ret=50;
                    break;
                default:
                    throw new NotSupportedException("Value " + val + " is not supported");
            }
            return ret;

        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}

正如你可能猜到的那样,我只写了一个方向,所以绑定不能双向工作,但我相信你得到了整个部分。

【讨论】:

  • 感谢 Felice 不厌其烦地编写代码。然而,我想要的恰恰相反。滑块中的值会改变,字符串的值也会相应改变。 Slider 在一个用户控件中(比如 userCtrl_child),这进一步驻留在另一个用户控件中(比如 userCtrl_parent),还有另一个 C# 类文件,比如 inpValidator.cs。所有这些都在同一个命名空间中。现在,我想通过 DataBinding 更改滑块值(userCtrl_Child 中的slider.Value)来更新字符串值(比如 inpValidator.cs 中的 inputSlider)。
  • 是否建议将父容器的 datacontext 设置为此 String 值,这样我就不必一路遍历 Application。
  • @r3st0r3 只是实现了我没有实现的转换。
【解决方案2】:

有多灵活?如此灵活,对我来说从未失败过一次。

您几乎可以使用 WPF 的绑定做任何事情。您可以使用转换器将双精度值绑定到字符串。您可以从多个绑定(MultiBinding)中获取一个值。您不必担心更改传播。

因为这听起来像是根据绑定的能力决定是否使用 WPF,所以不用担心!你可以做任何事!

如果您有具体问题,请发布具体问题。

【讨论】:

  • 这确实让我很失望。看看我的帖子stackoverflow.com/questions/2798447/is-mvvm-pointless/…
  • 无法绑定到方法。 :P 但我同意它非常灵活,只要您知道自己在做什么。
  • No Markus,这不是反对使用 WPF 的决定。直到现在我都在享受 WPF,我喜欢这个用非常强大的标记语言分离 UI 层的新系统。我正在向我的项目添加一个附加(非关键)功能,并希望通过 DataBinding 以正确的方式完成它,因为我使用的是 WPF。
【解决方案3】:

WPF 中的数据绑定比 Winforms 中的数据绑定要好得多,如果这就是您要问的吗?

正如 Markus 所建议的那样,不仅有更多易于转换的选项,而且需要担心的边缘情况更少,更有可能只是工作。

【讨论】:

  • 我不是在问这个。通过全新的 DependencyProperty 系统,我们可以在 WPF 中拥有更好的 DataBinding。 INotify aso 适用于 .NET 2.0。
  • 是的,您可以在 C 中使用面向对象的代码。但这并不意味着默认框架和语言都支持它。
【解决方案4】:

一旦了解了这些限制,WPF 的绑定系统就会非常灵活。

任何类型都可以绑定到任何其他类型。如果类型没有明显的转换,那么您可以使用IValueConverter 将一种类型转换为另一种类型。

到目前为止我发现的限制是:

  • 无法绑定到方法。绑定只能发生在属性之间。

  • 您只能绑定到控件上的DependencyProperties。大多数属性是DependencyProperties,但有时不是,这可能会令人沮丧。

  • 当 WPF 设置元素 DataContext 并且子元素想要访问原始 DataContext 时,事情会变得复杂。例如,在ListBox 中,每个项目的DataContext 都设置为ListBox 中的项目。因此,如果您想要 ListBox 中的 DataContext,您必须跳过一些障碍。

  • 另一个绑定问题来自不属于可视化树的项目,例如ContextMenus。与 ListBox 中的项目类似,您必须跳过几圈才能让它们正常工作。

大多数人实现INotifyPropertyChanged 以允许 WPF 监视对其绑定对象的更改。但是你也可以使用DependencyProperties,只要你的对象继承自DependencyObject

【讨论】:

  • 这是一个非常有用的列表。它将进入我的 WPF 快速参考书。谢谢。
猜你喜欢
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2013-08-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多