是否可以使用值转换器窗口属性?
我想为窗口的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));
}
,这只是一次更新:
...不幸的是我得到错误,我的价值转换器尚未找到。
这是因为资源被创建后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>
的顺序问题。另一种选择是按照@Clements的建议在App.xaml
中定义资源。
谢谢,它部分工作(我需要删除对AnomalyWindow的引用),但更新值有问题只更新一次值。我正在使用Path =“Ano”而不是使用Path =“。”,但使用“。”。它没有工作。另一方面,我还将值绑定到该属性,并且每次更改Ano值时都会更新textblock的值。我会将该代码添加到根邮件。 – buks
您是否尝试将绑定的Mode属性设置为TwoWay并为数据绑定的源属性引发PropertyChanged事件? – mm8
我之前没有设置TwoWay模式,因为至少在理论上我不需要它,单向模式在绑定到同一属性的另一个控件中运行良好。但是,从某种奇怪的原因看来,双向模式运行良好,值每次都会更新。谢谢。 – buks
http://www.thejoyofcode.com/WPF_Quick_Tip_Converters_as_MarkupExtensions.aspx
如果你看一下这个职位的V3部分,你会发现这个一个不错的简单优雅的解决方案,它可以让你做你想做的是这样的:
Top="{Binding ., Converter={local:MyTopConverter}, ConverterParameter={x:Reference Name=AnomalyWindow}}"
没有需要在里面定义它。资源在任何地方。
将资源声明移至App.xaml中的Application.Resources。为了将Window的DataContext传递给转换器,使用带MultiValueConverter的MultiBinding,其中一个子绑定只是' '。 –
Clemens
不幸的是,我在VSTO/Winforms应用程序内部托管WPF控件,所以我无法在App.xaml中放置声明 – buks