From: Gordon Padwick on 29 May 2010 22:42 I am having problems understanding how to use the Convert and ConvertBack methods in WPF. Help in Visual Studio 2008 and the various books I have deal with these methods only superficially. After reproducing various published examples, I tried to use Convert and ConvertBack on my own. My project was to display information about one of the system fonts in TextBlock controls. A TextBlock control, as I understand it, can display only a string. I had no problem in displaying a font family name in a TextBox control because something like SystemFonts.IconFontFamily returns a string. My problem arose when I tried to display the font size in a TextBlock. SystemFonts.IconFontSize returns a Double that can't be directly displayed in a TextBox; it must be converted to a string. That's where I ran into a problem that I haven't yet been able to solve. I have three files: Window1.xaml, Window1.xaml.cs, and Converter.cs. Window1.xaml contains: <Window x:Class="SystemFonts.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:src="clr-namespace:SystemFonts" Title="Window1" Height="300" Width="300"> <Window.Resources> <src:DoubleToStringConverter x:Key="formatter"/> </Window.Resources> <Grid> <TextBlock Height="21" Margin="124,0,34,41" Name="textBlock1" VerticalAlignment="Bottom" Text="{Binding Source= {x:Static SystemFonts.IconFontFamily}, Path=Source}" Background="White" /> <TextBlock Height="21" Margin="124,0,34,10" Name="textBlock2" VerticalAlignment="Bottom" Text="{Binding Source={x:Static SystemFonts.IconFontSize}, Path=Source, Converter={StaticResource formatter}}" Background="White"/> </Grid> </Window> Window1.xaml.cs contains: using System; using System.Windows; namespace SystemFonts { public partial class Window1 : Window { public Window1() { InitializeComponent(); } } } Converter.cs contains: using System; using System.Windows.Data; namespace SystemFonts { [ValueConversion(typeof(Double), typeof(String))] class DoubleToStringConverter : IValueConverter { public DoubleToStringConverter() { } public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Double IconFontSize = (Double)value; return IconFontSize.ToString(); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } } The build works okay, reporting "Build succeeded." When I run it, though, I see only the first TextBlock with the correct font name. Apparently, the convert code doesn't properly convert the font size (a Double) to a string so that it can be displayed in the TextBlock. Can someone, please, help me solve this problem? I'll also appreciate being pointed to a good source for thorough information about using the Convert and ConvertBack methods. Gordon
From: Peter Duniho on 30 May 2010 01:26 Gordon Padwick wrote: > I am having problems understanding how to use the Convert and > ConvertBack methods in WPF. Help in Visual Studio 2008 and the various > books I have deal with these methods only superficially. > > After reproducing various published examples, I tried to use Convert and > ConvertBack on my own. My project was to display information about one > of the system fonts in TextBlock controls. A TextBlock control, as I > understand it, can display only a string. I had no problem in displaying > a font family name in a TextBox control because something like > SystemFonts.IconFontFamily returns a string. > > My problem arose when I tried to display the font size in a TextBlock. > SystemFonts.IconFontSize returns a Double that can't be directly > displayed in a TextBox; it must be converted to a string. That's where I > ran into a problem that I haven't yet been able to solve. [...] I think the basic problem is that you misunderstand the use of the Path attribute. It works in the IconFontFamily case, because a FontFamily object actually has a Source property. But when you specify "Source" as the Path for the binding to the IconFontSize property, which returns a double, that binding fails because there's no Source property in the System.Double struct. I wish WPF would just throw an exception when you screw up the binding; it would make it a lot easier to detect and fix problems like this. But, you can still find out about errors by showing the Output window during debugging. Error messages from data binding will show up there. Had you looked, you would have seen an error related to the failure to find the Source property on the Double struct. Just leave off the Path. You want the value from the Source object itself, rather than some property in the Source object. So there's no need to specify a Path value in either case. Beyond that you should not need a converter at all, because the default is to simply use the ToString() return value, which is all your converter does anyway. Pete
From: Gordon Padwick on 30 May 2010 13:34 Thanks for the help and for so clearly explaining the problem. I followed your suggestion and everything works fine. Gordon "Peter Duniho" <no.peted.spam(a)no.nwlink.spam.com> wrote in message news:uf0K5i7$KHA.1448(a)TK2MSFTNGP06.phx.gbl... > Gordon Padwick wrote: >> I am having problems understanding how to use the Convert and ConvertBack >> methods in WPF. Help in Visual Studio 2008 and the various books I have >> deal with these methods only superficially. >> >> After reproducing various published examples, I tried to use Convert and >> ConvertBack on my own. My project was to display information about one of >> the system fonts in TextBlock controls. A TextBlock control, as I >> understand it, can display only a string. I had no problem in displaying >> a font family name in a TextBox control because something like >> SystemFonts.IconFontFamily returns a string. >> >> My problem arose when I tried to display the font size in a TextBlock. >> SystemFonts.IconFontSize returns a Double that can't be directly >> displayed in a TextBox; it must be converted to a string. That's where I >> ran into a problem that I haven't yet been able to solve. [...] > > I think the basic problem is that you misunderstand the use of the Path > attribute. It works in the IconFontFamily case, because a FontFamily > object actually has a Source property. But when you specify "Source" as > the Path for the binding to the IconFontSize property, which returns a > double, that binding fails because there's no Source property in the > System.Double struct. > > I wish WPF would just throw an exception when you screw up the binding; it > would make it a lot easier to detect and fix problems like this. But, you > can still find out about errors by showing the Output window during > debugging. Error messages from data binding will show up there. Had you > looked, you would have seen an error related to the failure to find the > Source property on the Double struct. > > Just leave off the Path. You want the value from the Source object > itself, rather than some property in the Source object. So there's no > need to specify a Path value in either case. > > Beyond that you should not need a converter at all, because the default is > to simply use the ToString() return value, which is all your converter > does anyway. > > Pete
|
Pages: 1 Prev: PLAY RACE GAMES Next: Application Settings: Don't get it! - I GOT IT NOW! |