C# 是否可以对窗口属性使用值转换器?

C# 是否可以对窗口属性使用值转换器?,c#,wpf,window,C#,Wpf,Window,我想为窗口的顶部和左侧属性绑定值。我需要使用valueconverter和valueconverterparameter(确切地说:我需要窗口的datacontext),不幸的是,我遇到了一个错误,没有找到我的值转换器 <Window x:Class="Proofing_Tool.wwwww" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://s

我想为窗口的顶部和左侧属性绑定值。我需要使用valueconverter和valueconverterparameter(确切地说:我需要窗口的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>
仅更新一次的:

如果你看一下那篇文章的V3部分,你会发现一个很好的简单优雅的解决方案,它允许你像这样做你想做的事情:

Top="{Binding ., Converter={local:MyTopConverter}, ConverterParameter={x:Reference Name=AnomalyWindow}}"
无需在任何地方的资源中定义它。

如果你看一下那篇文章的V3部分,你会发现一个很好的简单优雅的解决方案,它允许你像这样做你想做的事情:

Top="{Binding ., Converter={local:MyTopConverter}, ConverterParameter={x:Reference Name=AnomalyWindow}}"
不需要在内部定义它。任何地方都可以使用资源

…不幸的是,我得到的错误是找不到我的值转换器

<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>
这是因为资源是在设置了
Left
Top
属性之后创建的

您可以通过在创建资源后使用元素语法绑定到属性来解决此问题:

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

秩序很重要。另一个选项是在
App.xaml
中定义资源

…不幸的是,我得到的错误是找不到我的值转换器

<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>
这是因为资源是在设置了
Left
Top
属性之后创建的

您可以通过在创建资源后使用元素语法绑定到属性来解决此问题:

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


秩序很重要。另一个选项是在
App.xaml

中定义资源,将资源声明移动到App.xaml中的Application.resources。为了将窗口的DataContext传递给转换器,请使用带有多值转换器的多绑定,其中一个子绑定只是
。不幸的是,我在VSTO/Winforms app中托管WPF控件,因此无法将声明放在app.xaml中。请将资源声明移动到app.xaml中的Application.Resources。为了将窗口的DataContext传递给转换器,请使用带有多值转换器的多绑定,其中一个子绑定只是
。不幸的是,我在VSTO/Winforms应用中托管WPF控件,因此无法在应用中放置声明。谢谢,它部分工作(我需要删除对AnomalyWindow的引用),但更新值时出现问题,它只更新值一次。我现在使用Path=“Ano”而不是Path=“.”,但使用“.”它也不起作用。从另一方面来说,我也将值绑定到该属性,并且每次更改值时它都会更新textblock的值。我将把该代码添加到根帖子中。您是否尝试将绑定的Mode属性设置为TwoWay并引发数据绑定源属性的PropertyChanged事件?我之前没有设置woWay模式,因为,至少在理论上我不需要它,并且一种模式在绑定到同一属性的另一个控件中运行良好。但是,出于某种奇怪的原因,似乎双向模式运行良好,并且每次都会更新值。谢谢。谢谢,它部分工作(我需要删除对AnomalyWindow的引用),但更新值时出现问题,它只更新值一次。我现在使用Path=“Ano”而不是Path=“.”,但使用“”它也不起作用。从另一方面来说,我也将值绑定到该属性,并且每次更改值时它都会更新textblock的值。我将把该代码添加到根帖子中。您是否尝试将绑定的Mode属性设置为TwoWay并引发数据绑定源属性的PropertyChanged事件?我之前没有设置woWay模式,因为,至少在理论上我不需要它,而且一种模式在绑定到同一属性的另一个控件中工作得很好。但是,出于某种奇怪的原因,似乎TwoWay模式工作得很好,并且每次都会更新值。谢谢。