是否可以将值转换器用于窗口属性?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以将值转换器用于窗口属性?相关的知识,希望对你有一定的参考价值。
我想为窗口的Top和Left属性绑定值。我需要使用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>
编辑,更新值的问题,下面的部分很好:
<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
中的资源。
另一答案
http://www.thejoyofcode.com/WPF_Quick_Tip_Converters_as_MarkupExtensions.aspx
如果你看一下那篇文章的V3部分,你会找到一个很好的简单优雅的解决方案,它允许你做你想做的事情:
Top="{Binding ., Converter={local:MyTopConverter}, ConverterParameter={x:Reference Name=AnomalyWindow}}"
无需在里面定义.Resources就在任何地方。
以上是关于是否可以将值转换器用于窗口属性?的主要内容,如果未能解决你的问题,请参考以下文章