1

だから問題はこれです。Canvas.TopとCanvas.Leftを設定するUserControlが必要ですが、これらのプロパティはViewModelからバインドされています。簡単にするために、背後にコードがないユーザーコントロール用にこのコードを用意しましょう。

<UserControl x:Class="BadBinding.MyUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Canvas.Left="{Binding ElementName=slider, Path=Value}"
         >
 <Grid Width="100" Background="Red">
    <Slider x:Name="slider" Minimum="100" Maximum="250" />
 </Grid>
</UserControl>

そしてメインウィンドウのこのコード:

<Window x:Class="BadBinding.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    xmlns:local="clr-namespace:BadBinding"
    >
  <Canvas>
    <local:MyUserControl />
  </Canvas>
</Window>

なぜバインディングが機能しないのかわかりません。Canvas.Leftをある値に直接設定すると、ユーザーコントロールのコンテンツをメインウィンドウに直接書き込むだけでなく、すべてが正常になります。

4

2 に答える 2

2

UserControlに追加される前に が構築されCanvasCanvas.Left添付プロパティであるため、おそらく正しく解決されないためだと思います。

Referenceバインディングを使用してみてください。

<UserControl x:Class="BadBinding.MyUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Canvas.Left="{Binding Source={x:Reference Name=slider}, Path=Value}"
         >
 <Grid Width="100" Background="Red">
    <Slider x:Name="slider" Minimum="100" Maximum="250" />
 </Grid>
</UserControl>

注: コンパイル警告が表示される場合がありますが、それでもコンパイルされます。

しかし、最良の選択肢は、ユーザーコントロールにプロパティを作成して値をバインドすることだと思います。これも機能します。

于 2012-12-28T23:59:23.380 に答える
0

私はたくさん試しましたがBindings、私にとってもうまくいきました..だから、あなたが行きたいならEventHandler、次の回避策があなたを助けるかもしれません..

を削除しBindings、イベント ハンドラーをValueChangedイベントに追加します。

MyUserControl.xaml

<UserControl x:Class="BadBinding.MyUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 <Grid Width="100" Background="Red">
    <Slider x:Name="slider" Minimum="100" Maximum="250" ValueChanged="slider1_ValueChanged" />
 </Grid>
</UserControl>

MyUserControl.xaml.cs

private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
     Canvas.SetLeft(this, slider1.Value);            
}   

私はこれを試してみましたが、問題が見つかった場合は私に知らせてください..

于 2012-12-29T06:52:40.097 に答える