是否可以将值转换器用于窗口属性?

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));
}

这只更新一次:

答案

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

那是因为资源是在设置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中的资源。

另一答案

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

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

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

无需在里面定义.Resources就在任何地方。

以上是关于是否可以将值转换器用于窗口属性?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 iOS 中使用 KVC 将值设置为只读属性?

如何在运行时将值从窗口传递到用户控件?

我可以将活动转换为浮动窗口吗?

是否有标准或首选标签类型可用于向某个位置添加额外的锚点/片段链接?

如何将值从片段/活动传递到 xml?

easyui的学习总结