无法使用c#/XAML metro应用程序中的字节到字符串转换器获取字符串中的文件大小
我只是想将文件大小转换为字符串格式,如“1MB”或“2.5GB”,我引用了转换器,我想,我的XAML代码可能有错误,请帮助我解决这个问题 MainPage.XAML无法使用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,
<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;
}