WPF中DataBinding的灵活性如何?

时间:2011-02-27 10:15:26

标签: c# wpf data-binding

  

WPF中DataBinding的灵活性如何?一世   我是WPF的新手,想拥有一个   明确的想法。我能绑一根绳子吗?   具有Slider值的变量?可以   总是必须是一个控制?

     

是否可以绑定字符串   使用Slider控件的值以便它   实时更新?多远了   逻辑树执行更新旅行或   我们是否必须重新发布所有命令   使用这个新值?

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

我想要做的是,我有一个具有多个用户控件的应用程序。这些用户控件是网格视图,包含控件(TextBox,Button)和应用程序UI的各个部分。我使用这种方法将我的主要XAML文件分割成多个文件,直到现在它都适用于我。现在,我在一个用户控件中有一个Slider,并希望在另一个用户控件中绑定一个String变量。字符串变量是只读的,因此不能用于双向绑定。

我希望这可以使我的问题清楚。在我的代码中,我正在尝试更新变量zoomFactor:

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

带有滑块控件。对于那些能够发现它的人,是的,它是谷歌静态地图API,是的,我试图用滑块放大地图。

4 个答案:

答案 0 :(得分:4)

您通常可以使用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
    }
}

正如你可能猜到的那样,我只是在一个方向上编写它,所以绑定在两个方面都不起作用,但我确信你得到了整个部分。

答案 1 :(得分:1)

有多灵活?如此灵活,它对我来说并没有失败。

你可以用WPF的绑定做很多事情。您可以使用转换器将双值绑定到字符串。你可以从多个绑定中获取一个值(MultiBinding)。您不必担心变化传播。

因为这听起来像是决定/反对使用WPF,取决于绑定的能力,不用担心!你可以做任何事情!

如果您遇到特定问题,请发布具体问题。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

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

  • 无法绑定到方法。绑定只能在属性之间进行。

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

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

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

大多数人实现ListBox以允许WPF监视其绑定对象的更改。但是,只要您的对象继承自INotifyPropertyChanged

,您也可以使用DependencyProperties