Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用c#/XAML metro应用程序中的字节到字符串转换器获取字符串中的文件大小_C#_Xaml_Properties_Microsoft Metro_Ivalueconverter - Fatal编程技术网

无法使用c#/XAML metro应用程序中的字节到字符串转换器获取字符串中的文件大小

无法使用c#/XAML metro应用程序中的字节到字符串转换器获取字符串中的文件大小,c#,xaml,properties,microsoft-metro,ivalueconverter,C#,Xaml,Properties,Microsoft Metro,Ivalueconverter,我只是想将文件大小转换为字符串格式,如“1MB”或“2.5GB”,我引用了转换器,我想,我的XAML代码可能有错误,请帮助我解决这个问题 MainPage.XAML <Page.Resources> <local:ByteToStringConverter x:Key="BytesToString" /> </Page.Resources> <Grid> <TextBlock Text="{Binding Path=Size,

我只是想将文件大小转换为字符串格式,如“1MB”或“2.5GB”,我引用了转换器,我想,我的XAML代码可能有错误,请帮助我解决这个问题

MainPage.XAML

<Page.Resources>
    <local:ByteToStringConverter x:Key="BytesToString" />
</Page.Resources>
<Grid>
    <TextBlock Text="{Binding Path=Size, Converter={StaticResource BytesToString}}"/>
</Grid>
ByteToStringConverter.cs

public class ByteToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        string size = "0 KB";

        if (value != null)
        {

            double byteCount = 0;

            byteCount = System.Convert.ToDouble(value);

            if (byteCount >= 1073741824)
                size = String.Format("{0:##.##}", byteCount / 1073741824) + " GB";
            else if (byteCount >= 1048576)
                size = String.Format("{0:##.##}", byteCount / 1048576) + " MB";
            else if (byteCount >= 1024)
                size = String.Format("{0:##.##}", byteCount / 1024) + " KB";
            else if (byteCount > 0 && byteCount < 1024)
                size = "1 KB";    //Bytes are unimportant ;)            
        }

        return size;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}
公共类ByteToStringConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、字符串语言)
{
字符串大小=“0 KB”;
if(值!=null)
{
双字节计数=0;
字节数=System.Convert.ToDouble(值);
如果(字节数>=1073741824)
size=String.Format(“{0:###.###}”,字节数/1073741824)+“GB”;
else if(字节数>=1048576)
size=String.Format(“{0:###.###}”,字节数/1048576)+“MB”;
else if(字节数>=1024)
size=String.Format(“{0:###.###}”,字节数/1024)+“KB”;
else if(字节数>0&&字节数<1024)
size=“1 KB”;//字节不重要;)
}
返回大小;
}
公共对象转换回(对象值、类型targetType、对象参数、字符串语言)
{
抛出新的NotImplementedException();
}
}

[编辑:更新以反映新代码]

首先,t在
MyClass
中完成接口,并在
Size
更改时触发事件。这将确保绑定被更新

其次,将页面的数据绑定设置为
MyClass
的实例,例如

<Page.DataContext> 
    <local:MyClass/> 
</Page.DataContext>
为什么?WPF中的绑定是对特定对象实例进行的。例如,如果控件A绑定到对象X,并且对象X的属性发生更改,则控件A将被更新。如果控件a绑定到对象X,但另一个对象Y的值更改,则不会通知控件a

在导航到的
中创建一个新对象创建了一个对象Y。您想改为在对象X上设置
Size
属性

要对此进行调试,请执行以下操作:

  • 先在没有转换器的情况下尝试,以确保值已更新,然后添加转换器。这将把任何转换器问题与绑定问题分开
  • 在setter中为
    Size
    设置断点。如果命中,则问题在于绑定。如果没有,问题是没有设置
    大小

非常次要的侧重点:在
Convert
中使用
ulong
而不是
double
ulong
s给出64位精度,而
double
只给出53位精度。您可能永远看不到如此大的字节数,但它也使其与
MainPage

中的属性类型保持一致。仍然数据未与textblock绑定,我尝试删除转换器
DataContext
设置为什么?尝试将其设置为页面本身。谁的
DataContext
?我尝试在MainPage.xaml.cs中使用
this.DataContext=this
,但不起作用。我阅读了更新的代码。两个变化。首先:将绑定设置为
MyClass
的实例。不是那页(可能是我的错)。第二:将MyClass对象存储在类字段中。否则,它可能会超出范围并被垃圾收集。请在Size属性的setter上放置一个断点,然后查看是否调用了它。这将告诉你问题是在那之前还是之后。
<Page.DataContext> 
    <local:MyClass/> 
</Page.DataContext>
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
    StorageFile f = await KnownFolders.MusicLibrary.GetFileAsync("video.mp4");
    BasicProperties bs = await f.GetBasicPropertiesAsync();

    // Do not create a new instance       
    ((MyClass) DataContext).Size = bs.Size;
}