繁体   English   中英

带转换器的C#WPF绑定路径数据

[英]C# WPF Binding Path Data with Converter

我在将字符串转换为图标时遇到问题。 图标Geometry在ResourceDictionary中。 未调用ValueConverter(我尝试在Converter的Convert方法中进行调试)。 这是我的代码:

xaml:

<Window.Resources>
    <local:StatusToPathDataConverter x:Key="PathConverter"/>
</Window.Resources>
<Grid>
    <Path Width="20"
        Height="20"
        Stretch="Uniform"
        Fill="Black" 
        Data="{Binding Path=Status,
             UpdateSourceTrigger=PropertyChanged, 
             Converter={StaticResource PathConverter}}"/>
</Grid>

CS:

public partial class MainWindow :Window {
    public MainWindow() {
        InitializeComponent();
    }

    public string Status
    {
        get { return (string)GetValue(StatusProperty); }
        set { SetValue(StatusProperty, value); }
    }

    public static readonly DependencyProperty StatusProperty =
         DependencyProperty.Register("Status", typeof(string), typeof(MainWindow));


}
public class StatusToPathDataConverter :IValueConverter {
    private static ResourceDictionary iconDictionary;
    public ResourceDictionary IconDictionary
    {
        get
        {
            if(iconDictionary == null) {
                iconDictionary = new ResourceDictionary();
                iconDictionary.Source = new Uri("/WPFBindingTest;component/Resources/IconDictionary.xaml", UriKind.RelativeOrAbsolute);
            }
            return iconDictionary;
        }
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        var status = (string)value;
        if(statinStatus == null)
            return null;
        switch(status.ToLower()) {
            case "test":
                return IconDictionary["TestIcon"];
                // ...
        }
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        throw new NotImplementedException();
    }
}

您没有绑定任何东西。 您需要告诉BindingWindow找到Status属性。 推荐的方法是使用RelativeSource ,如下所示:

<Path 
    Width="20"
    Height="20"
    Stretch="Uniform"
    Fill="Black" 
    Data="{Binding Path=Status,
         RelativeSource={RelativeSource AncestorType=Window},
         Converter={StaticResource PathConverter}}"
         />

如@Clemens所述, UpdateSourceTrigger=PropertyChanged在此绑定上没有任何意义,因此不应存在。 该属性告诉Binding何时应更新绑定的source属性。 在这种情况下,源属性是Window.Status

但是, Path.Data属性不会更新其绑定的属性。 Path显示Geometry ; 它不会编辑Geometry 对于更新视图模型属性的控件属性(例如TextBox.Text存在UpdateSourceTrigger 这是UpdateSourceTrigger=PropertyChanged的最常见用法:默认情况下,当TextBox失去焦点时, TextBox.Text更新source属性,但有时您希望它在每次击键时进行更新。

将窗口的DataContext设置为其自身,以便绑定起作用,并调用该转换器的Convert方法:

public MainWindow() {
    InitializeComponent();
    DataContext = this;
}

如果到source属性的绑定失败,则将永远不会调用该转换器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM