2017-12-18 26 views
0

ウィンドウのTopプロパティとLeftプロパティの値をバインドしたいと思います。私はvalueconverterとvalueconverterパラメータ(正確には:私は私のウィンドウのdatacontextが必要です)を使用する必要があります、unfortunatelly私の値​​のコンバータが見つかりませんエラーを取得しています。ウィンドウのプロパティに値コンバーターを使用することは可能ですか?

<Window x:Class="Proofing_Tool.wwwww" 
     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" 
     xmlns:local="clr-namespace:Proofing_Tool" 
     xmlns:conv="clr-namespace:Proofing_Tool.ValueConverters" 
     mc:Ignorable="d" 
     Height="180" 
     MinHeight="50" 
     Width="340" 
     SizeToContent="Height" 
     AllowsTransparency="True" 
     WindowStyle="None" 
     Background="{x:Null}"  
     OpacityMask="White" 
     Name="AnomalyWindow" 
     Title="Anomaly Details" 
     ResizeMode="NoResize" 
     Left="{Binding ., Converter={StaticResource ValueConverterAnomalyToLeft},ConverterParameter={x:Reference Name=AnomalyWindow}}" 
     Top="{Binding ., Converter={StaticResource ValueConverterAnomalyToTop},ConverterParameter={x:Reference Name=AnomalyWindow}}"> 
    <Window.Resources> 
     <conv:ValueConverterAnomalyToLeft x:Key="ValueConverterAnomalyToLeft" /> 
     <conv:ValueConverterAnomalyToTop x:Key="ValueConverterAnomalyToTop" /> 
</Window.Resources> 

EDITは、一部の下に、値を更新して問題がうまく機能:背後

   <TextBlock Grid.Column="1" Text="{Binding Ano.Name, Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"/> 

コード:

public Anomaly Ano 
{ 
    get { return _ano; } 
    set 
    { 
     _ano = value; 
     NotifyPropertyChanged(); 
    } 
} 
public event PropertyChangedEventHandler PropertyChanged; 
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
{ 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

一度だけ更新されます

+2

リソース宣言をApp.xamlのApplication.Resourcesに移動します。ウィンドウのDataContextをコンバーターに渡すにはMultiValueConverterでMultiBindingを使用します。ここでは、子バインディングの1つは「」です。 – Clemens

+0

Unfortunatelly、VSTO/Winformsアプリケーション内でWPFコントロールをホストしているため、App.xaml内に宣言を入れることができません – buks

答えて

1

... unfortunatelly私のバリューコンバータが見つかりませんでした。リソースがLeftTopプロパティが設定されている後を作成しているためだ

あなたは、リソースが作成された後のプロパティにバインドする要素構文を使用してこの問題を解決することができます

<Window x:Class="Proofing_Tool.wwwww" 
    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" 
    xmlns:local="clr-namespace:Proofing_Tool" 
    xmlns:conv="clr-namespace:Proofing_Tool.ValueConverters" 
    mc:Ignorable="d" 
    Height="180" 
    MinHeight="50" 
    Width="340" 
    SizeToContent="Height" 
    AllowsTransparency="True" 
    WindowStyle="None" 
    Background="{x:Null}"  
    OpacityMask="White" 
    Name="AnomalyWindow" 
    Title="Anomaly Details" 
    ResizeMode="NoResize"> 
    <Window.Resources> 
     <conv:ValueConverterAnomalyToLeft x:Key="ValueConverterAnomalyToLeft" /> 
     <conv:ValueConverterAnomalyToTop x:Key="ValueConverterAnomalyToTop" /> 
    </Window.Resources> 
    <Window.Left> 
     <Binding Path="." Converter="{StaticResource ValueConverterAnomalyToLeft}" ConverterParameter="{x:Reference Name=AnomalyWindow}" /> 
    </Window.Left> 
    <Window.Top> 
     <Binding Path="." Converter="{StaticResource ValueConverterAnomalyToTop}" ConverterParameter="{x:Reference Name=AnomalyWindow}" /> 
    </Window.Top> 
</Window> 

注文事項を。もう1つのオプションは、@Clementsが提案するようにApp.xamlのリソースを定義することです。

+0

これは部分的に動作します(AnomalyWindowへの参照を削除する必要がありました)が、値の更新に問題があります値は1回だけ更新されます。 Path = "。"を使用する代わりにPath = "Ano"を使用していますが、 "。"それはうまくいかなかった。一方、私はそのプロパティに値をバインドし、Ano値が変更されるたびにtextblockの値を更新しました。そのコードをルート投稿に追加します。 – buks

+1

バインディングのModeプロパティをTwoWayに設定し、データバインドされたソースプロパティのPropertyChangedイベントを発生させようとしましたか? – mm8

+0

私は以前のTwoWayモードを設定していません。なぜなら、少なくとも理論的に私はそれを必要とせず、片方向モードは同じプロパティにバインドされた別のコントロールでうまく機能していたからです。しかし、いくつかの奇妙な理由からTwoWayモードがうまく動作し、毎回値が更新されるようです。ありがとうございました。 – buks

1

http://www.thejoyofcode.com/WPF_Quick_Tip_Converters_as_MarkupExtensions.aspx

あなたがそのポストのV3セクションを見れば、あなたはあなたがこのようにやりたいことができ、このための良いシンプルでエレガントなソリューション、見つける:

Top="{Binding ., Converter={local:MyTopConverter}, ConverterParameter={x:Reference Name=AnomalyWindow}}" 

をなしそれをどこにでも定義する必要があります。

関連する問題