0

私は持っています:

System.Windows.Dataエラー:4:参照'ElementName=Test'でバインドするためのソースが見つかりません。BindingExpression:Path = Value; DataItem = null; ターゲット要素は'Slider'(Name ='');です。ターゲットプロパティは'Value'(タイプ'Double')です

非常に特殊な場合のエラー。名前スコープの問題については考えましたが、修正方法がわかりません。

次の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インスペクター」を開いて、アプリケーションにアタッチすることです。結果:バインディングが修正されました。

この現象をどのように説明しますか?

4

1 に答える 1

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 はコンテンツ プレゼンター内にあるため、そのような値にアクセスすることはできません。コンテンツ プレゼンターでこれを実現するには、同じビューモデル プロパティにバインドする必要があります。

編集

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 が重い作業を引き継ぎます...最初のスライダーの値をプロパティにバインドしSliderValue(これMode=TwoWayは、このコントロールがプロパティの状態を設定および取得できることを示します)、他のスライダーを同じ値にバインドしたSliderValueので、最初と同期して動くこと

お役に立てれば

于 2013-01-17T11:42:20.133 に答える