我已经成功地将存储在隔离存储中的图像绑定到XAML中定义的列表框内的“图像”元素,没有任何问题。
我所做的是使用在隔离存储中存储图像名称和位置的属性,并使用IValueConverter实际打开文件并获取其流。
我很惊讶地看到我不能在一个更简单的设置的新XAML中做到这一点。我只有这个:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Grid.Resources>
<c:BinaryToImageSRCConverter x:Key="imageConverter" />
</Grid.Resources>
<Image Name="TheImage" Source="{Binding PhotoName, Converter={StaticResource imageConverter}}" Width="430" Height="430" VerticalAlignment="Center" Stretch="UniformToFill">
</Image>
</Grid>
这就是我在ModelView中所拥有的:
public string PhotoName { get; set; }
PhotoName = "Images\\0.jpg";
文件的路径和名称是正确的,因此不存在“找不到文件”的问题。
我的问题是我的IValueConverter的Convert方法永远不会被调用。
正如我之前提到的,我在另一个XAML(在同一个项目中)成功使用了这个转换器,一切正常。唯一的区别是我绑定到ListBox使用的图像。
在这种情况下,为什么没有调用我的IValueConverter的Convert方法的任何想法或提示?
谢谢!
以下是我的尝试:
实施 INotifyPropertyChanged :
public class PhotoNameClass : INotifyPropertyChanged
{
public string PhotoNameValue = string.Empty;
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public string PhotoName
{
get
{
return this.PhotoNameValue;
}
set
{
if (value != this.PhotoNameValue)
{
this.PhotoNameValue = value;
NotifyPropertyChanged("PhotoName");
}
}
}
}
这是我分配给该物业的方式:
public partial class ShowContent : PhoneApplicationPage
{
PhotoNameClass photoClass = new PhotoNameClass();
}
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
photoClass.PhotoName = "Images\\0.jpg";
base.OnNavigatedTo(e);
}
使用DependencyProperty
public partial class ShowContent : PhoneApplicationPage
{ // PhotoNameClass photoClass = new PhotoNameClass();
public string PhotoName
{
get { return (string)GetValue(PhotoNameProperty); }
set { SetValue(PhotoNameProperty, value); }
}
public static readonly DependencyProperty PhotoNameProperty = DependencyProperty.Register("PhotoName", typeof(string), typeof(ShowContent), new PropertyMetadata(""));
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
PhotoName = "Images\\0.jpg";
}
以下是XAML的相关部分:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Grid.Resources>
<c:BinaryToImageSRCConverter x:Key="imageConverter" />
</Grid.Resources>
<Image Name="TheImage" Source="{Binding PhotoName, Converter={StaticResource imageConverter}}" Width="430" Height="430" VerticalAlignment="Center" Stretch="UniformToFill">
</Image>
</Grid>
其中,c定义为:
xmlns:c="clr-namespace:ImageApplication"
感谢。
更新
我正在使用INotifyPropertyChanged实现来公开我的属性。
我已将XAML代码更改为:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Grid.Resources>
<c:PhotoNameClass x:Key="photoClass" />
<c:BinaryToImageSRCConverter x:Key="imageConverter" />
</Grid.Resources>
<Image Source="{Binding PhotoName, Converter={StaticResource imageConverter}}" DataContext="{StaticResource photoClass}" Width="430" Height="430" VerticalAlignment="Center" Stretch="UniformToFill">
</Image>
</Grid>
</Grid>
因此,我添加了image元素的“DataContext”属性,指定包装我的属性的类的名称。在这种情况下, IValueConverter的Convert方法称为。但是,这是不对的,因为我在添加DataContext时在XAML中收到错误:“无法确定调用者的应用程序身份”,当然,踩到Convert方法,我的“value”字符串为空,因此,“右边“”PhotoName“没有被填充。
感谢任何想法...
P.S。这是我如何定义IValueConverter的Convert方法:
namespace ImageApplication
{
public class BinaryToImageSRCConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{ // <-- Breakpoint here. Never gets triggered except after I added the "DataContext" attribute to the XAML image element.
// but in that case, "value" is an empty string.
if (value != null && value is string)
{
...
UPDATE FIXED
我已经解决了这个问题。我已将包含my property的类名分配给XAML代码中定义的图像的DataContext属性。
谢谢大家。我希望这能帮助那些人。
答案 0 :(得分:0)
它永远不会被调用,因为您的属性不会引发PropertyChanged
通知。您需要将其设为DependencyProperty
或实施INotifyPropertyChanged
,并在设置属性值时引发PropertyChanged
事件。