[英]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();
}
}
您没有绑定任何东西。 您需要告诉Binding
去Window
找到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.