2017-12-18 85 views
0

我想为窗口的Top和Left属性绑定值。我需要使用valueconverter和valueconverter参数(具体来说:我需要我的窗口的datacontext),不幸的是我得到错误,我的价值转换器尚未找到。是否可以使用值转换器窗口属性?

<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> 

编辑,以更新值,下面的部分问题效果很好:背后

   <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。为了将Window的DataContext传递给转换器,使用带MultiValueConverter的MultiBinding,其中一个子绑定只是''。 – Clemens

+0

不幸的是,我在VSTO/Winforms应用程序内部托管WPF控件,所以我无法在App.xaml中放置声明 – buks

回答

1

...不幸的是我得到错误,我的价值转换器尚未找到。

这是因为资源被创建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> 

的顺序问题。另一种选择是按照@Clements的建议在App.xaml中定义资源。

+0

谢谢,它部分工作(我需要删除对AnomalyWindow的引用),但更新值有问题只更新一次值。我正在使用Path =“Ano”而不是使用Path =“。”,但使用“。”。它没有工作。另一方面,我还将值绑定到该属性,并且每次更改Ano值时都会更新textblock的值。我会将该代码添加到根邮件。 – buks

+1

您是否尝试将绑定的Mode属性设置为TwoWay并为数据绑定的源属性引发PropertyChanged事件? – mm8

+0

我之前没有设置TwoWay模式,因为至少在理论上我不需要它,单向模式在绑定到同一属性的另一个控件中运行良好。但是,从某种奇怪的原因看来,双向模式运行良好,值每次都会更新。谢谢。 – buks

相关问题