WPF“无法找到与ContentPresenters和UserControl绑定的源代码”

时间:2013-01-16 23:44:01

标签: c# .net wpf data-binding binding

我有一个:

  

System.Windows.Data错误:4:找不到绑定源   引用'ElementName = Test'。 BindingExpression:路径=值;   的DataItem = NULL; target元素是'Slider'(Name ='');目标财产   是'价值'(类型'双')

在一个非常特殊的情况下出错。 我虽然关于名称范围问题,但我不知道如何解决它。

考虑以下WPF应用程序:

MyUserControl.xaml

<UserControl x:Class="WpfApplication1.MyUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <Label Grid.Row="0" Content="Move me !"/>
        <Slider x:Name="Test" Grid.Row="0" Grid.Column="1" />
        <Label Grid.Row="1" Content="Binded slider"/>
        <ContentPresenter Grid.Row="1" Grid.Column="1">
            <ContentPresenter.Content>
                <Slider Value="{Binding Value, ElementName=Test}"/>
            </ContentPresenter.Content>
        </ContentPresenter>
    </Grid>
</UserControl>

MyUserControl.xaml.cs

using System.Windows.Controls;

namespace WpfApplication1
{
    public partial class MyUserControl : UserControl
    {
        public MyUserControl()
        {
            InitializeComponent();
        }
    }
}

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Width="300" Height="120">

    <StackPanel>
        <Button Click="Button_Click" Content="Click me to show Sliders !" Height="25"/>
        <ContentPresenter x:Name="contentPresenter"/>
    </StackPanel>
</Window>

MainWindow.xaml.cs

using System.Windows;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        private MyUserControl myUserControl;

        public MainWindow()
        {
            InitializeComponent();

            myUserControl = new MyUserControl();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            contentPresenter.Content = myUserControl;
        }
    }
}

鉴于MyUserControl.xaml的代码,我希望绑定的滑块与第一个具有相同的值。

但没有任何反应。

现在,棘手的部分:启动应用程序,单击按钮,移动第一个滑块,打开“WPF Inspector”并将其附加到应用程序。结果:绑定是固定的。

你如何解释这种现象?

1 个答案:

答案 0 :(得分:0)

这样就可以了解

    <!--<ContentPresenter Grid.Row="1" Grid.Column="1">
        <ContentPresenter.Content>-->
            <Slider Value="{Binding Value, ElementName=Test}" Grid.Column="1" Grid.Row="1"/>
        <!--</ContentPresenter.Content>
    </ContentPresenter>-->

因为Slider在内容演示者中,所以你无法像这样访问它的价值。您需要绑定到同一个viewmodel属性,以便在内容展示器中使用它。

修改

Get Prism并使用ViewModel ......我不会详细介绍......但你需要做的就是这个......

在您下载所有内容之后,将Microsoft.Practices.Prism dll添加到您的项目中

创建一个新类(ViewModel)。并根据需要创建它。我打电话给我MyUserControlViewModel,让它看起来像这样

using Microsoft.Practices.Prism.ViewModel;

namespace YourNamespace
{
    public class MyUserControlViewModel : NotificationObject
    {
        private double _sliderValue;

        public double SliderValue
        {
            get { return _sliderValue; }
            set
            {
                _sliderValue = value;
                RaisePropertyChanged(() => SliderValue);
            }
        }

    }
}

像这样更改用户控件中的XAML

<Slider x:Name="Test" Grid.Row="0" Grid.Column="1" Value="{Binding SliderValue, Mode=TwoWay}"/>        
<ContentPresenter Grid.Row="1" Grid.Column="1">
    <ContentPresenter.Content>
        <Slider Value="{Binding SliderValue}"/>
    </ContentPresenter.Content>
</ContentPresenter>

将这行代码添加到MyUserControl.cs文件中

DataContext = new MyUserControlViewModel();

现在,ViewModel接管了繁重的工作......你将第一个滑块的值绑定到Property SliderValueMode=TwoWay表示此控件可以设置并获取状态并且您已将另一个滑块绑定到相同的SliderValue,以便它与第一个滑块同步

希望这有帮助