从 class 上的 void 中获取字符串值无法正确输出
Getting the string value from a void on a class does not output correctly
我得到了一个 class,稍后我将其作为列表框上的 ItemsSource 挂接。这个列表框有一个项目,它有一个图像绑定“{Binding LocalImage}”。问题在于,当 Item 从 LocalImage 获取值时,它不应该返回 null 值。 void doesImageExistLocally 完美运行,并且已经在另一个项目上进行了测试。
从 Main void 单独调用它会正确输出图像的路径,因此它不是 void 的问题,而是 class / 列表框项目获取值的问题。还需要注意字符串 Image 也被正确分配。 Console.WriteLine(Logic.doesImageExistLocally("imageurl"));
public class Test {
private string _LocalImage;
public string Image {get; set:}
public string LocalImage
{
get { return _LocalImage; }
set { _LocalImage = doesImageExistLocally(Image); }
}
}
编辑:
Test test = new Test();
test.Image = "URL";
doesImageExistLocally(Image); // output = Images/name-of-picture.jpg
Console.WriteLine(test.LocalImage); // output = null;
无效代码:
public static string doesImageExistLocally(string imageURL)
{
Uri uri = new Uri(imageURL);
string path = "Images/" + System.IO.Path.GetFileName(uri.LocalPath);
Console.WriteLine(path);
if (!File.Exists(path))
{
using (WebClient client = new WebClient())
{
client.DownloadFile(new Uri(imageURL), path);
}
}
return path;
}
在测试 class 中,从未设置 LocalImage。使用此代码:
public class Test {
private string _LocalImage;
private string _Image;
public string Image
{
get
{
return _Image;
}
set
{
_Image = value;
_LocalImage = doesImageExistLocally(value);
}
}
public string LocalImage
{
get { return _LocalImage; }
}
}
我想如果你这样修改你的代码,它会是正确的。
Test test = new Test();
test.Image = "URL";
test.LocalImage = "URL"; // output = Images/name-of-picture.jpg
Console.WriteLine(test.LocalImage); // output = null;
问题是您从未主动设置 LocalImage
,即使您在 属性 中调用方法也是如此。为了证明这一点,在 set 行上设置一个调试器标记,你将永远不会命中它。
老实说,我不喜欢像您那样设置 属性。在我看来,您可以通过两种方式来实现,一种是通过构造函数设置它,或者在 class 实例化之后设置它。这样您就可以更好地控制 属性。如果你绝对想在设置Image后设置它属性,你可以按照另一个答案。
以构造函数为例:
public Test()
{
LocalImage = DoesImageExistLocally(Image);
}
public string Image { get; set; }
public string LocalImage { get; set; }
或class实例化后的例子:
test.LocalImage = DoesImageExistLocally(test.Image);
现在,当您调用 test.LocalImage
时,您会得到预期的结果 "Images/name-of-picture.jpg"
尽情享受吧。
我得到了一个 class,稍后我将其作为列表框上的 ItemsSource 挂接。这个列表框有一个项目,它有一个图像绑定“{Binding LocalImage}”。问题在于,当 Item 从 LocalImage 获取值时,它不应该返回 null 值。 void doesImageExistLocally 完美运行,并且已经在另一个项目上进行了测试。
从 Main void 单独调用它会正确输出图像的路径,因此它不是 void 的问题,而是 class / 列表框项目获取值的问题。还需要注意字符串 Image 也被正确分配。 Console.WriteLine(Logic.doesImageExistLocally("imageurl"));
public class Test {
private string _LocalImage;
public string Image {get; set:}
public string LocalImage
{
get { return _LocalImage; }
set { _LocalImage = doesImageExistLocally(Image); }
}
}
编辑:
Test test = new Test();
test.Image = "URL";
doesImageExistLocally(Image); // output = Images/name-of-picture.jpg
Console.WriteLine(test.LocalImage); // output = null;
无效代码:
public static string doesImageExistLocally(string imageURL)
{
Uri uri = new Uri(imageURL);
string path = "Images/" + System.IO.Path.GetFileName(uri.LocalPath);
Console.WriteLine(path);
if (!File.Exists(path))
{
using (WebClient client = new WebClient())
{
client.DownloadFile(new Uri(imageURL), path);
}
}
return path;
}
在测试 class 中,从未设置 LocalImage。使用此代码:
public class Test {
private string _LocalImage;
private string _Image;
public string Image
{
get
{
return _Image;
}
set
{
_Image = value;
_LocalImage = doesImageExistLocally(value);
}
}
public string LocalImage
{
get { return _LocalImage; }
}
}
我想如果你这样修改你的代码,它会是正确的。
Test test = new Test();
test.Image = "URL";
test.LocalImage = "URL"; // output = Images/name-of-picture.jpg
Console.WriteLine(test.LocalImage); // output = null;
问题是您从未主动设置 LocalImage
,即使您在 属性 中调用方法也是如此。为了证明这一点,在 set 行上设置一个调试器标记,你将永远不会命中它。
老实说,我不喜欢像您那样设置 属性。在我看来,您可以通过两种方式来实现,一种是通过构造函数设置它,或者在 class 实例化之后设置它。这样您就可以更好地控制 属性。如果你绝对想在设置Image后设置它属性,你可以按照另一个答案。
以构造函数为例:
public Test()
{
LocalImage = DoesImageExistLocally(Image);
}
public string Image { get; set; }
public string LocalImage { get; set; }
或class实例化后的例子:
test.LocalImage = DoesImageExistLocally(test.Image);
现在,当您调用 test.LocalImage
时,您会得到预期的结果 "Images/name-of-picture.jpg"
尽情享受吧。