2016-04-20 11 views
1

Ich kenne diesen Beitrag: TextBox FontFamily Binding, ähnelt meiner Frage, aber mein Fall ist viel einfacher, möchte ich das FontFamily-Attribut eines TextBox-Steuerelements an eine ComboBox binden, wenn Der Wert der ComboBox wird geändert, der Inhalt der TextBox ändert sich entsprechend. Ich bin mit VM oder Abhängigkeitseigenschaft nicht, folgte ich dieses Tutorial: https://dotnetstories.wordpress.com/2011/07/31/using-type-converters-in-wpf/WPF - Binding FontFamily von TextBox zu einer ComboBox

Und kam mit:

<Window x:Class="NumericControlTest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:NumericControlTest" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 

<Window.Resources> 
    <local:FontFamilyConversions x:Key="FontFamilyConversions" /> 
</Window.Resources> 

<DockPanel> 

    <ComboBox DockPanel.Dock="Top" x:Name="Fonttype" > 
     <ComboBoxItem IsSelected="True">Arial</ComboBoxItem> 
     <ComboBoxItem>Batang</ComboBoxItem> 
     <ComboBoxItem>BatangChe</ComboBoxItem> 
     <ComboBoxItem>Gungsuh</ComboBoxItem> 
     <ComboBoxItem>GungsuhChe</ComboBoxItem> 
     <ComboBoxItem>Courier New</ComboBoxItem> 
    </ComboBox> 
    <TextBox x:Name="editor" FontSize="16" FontFamily="{Binding Path=SelectedValue, ElementName=Fonttype, Mode=OneWay, Converter={StaticResource FontFamilyConversions}}" > 

    </TextBox> 
</DockPanel> 

using System.Windows.Data; 
using System.Windows.Media; 

namespace NumericControlTest 
{ 
    class FontFamilyConversions : IValueConverter 
    { 
     public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      FontFamily fontfamily = new FontFamily("Verdana"); 
      if (value != null) 
      { 
       fontfamily = new FontFamily(value.ToString()); 
      } 
      return fontfamily; 
     } 

     public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      return null; 
     } 
    } 
} 

Aber es funktioniert nicht, nachdem ich die ComboBox ändern Wert, passiert nichts.

Danke für Ihre Zeit.

Antwort

3

Ein Breakpoint auf return fontfamily; würde zeigen, dass Sie nicht bekommen, was Sie von value.ToString() erwarten. Sie verlassen nun die Content vom ComboBoxItem erhalten müssen:

public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    FontFamily fontfamily = new FontFamily("Verdana"); 
    ComboBoxItem selectedFont = value as ComboBoxItem; 
    if (selectedFont != null) 
    { 
     fontfamily = new FontFamily(selectedFont.Content.ToString()); 
    } 
    return fontfamily; 
} 

Sie den Konverter alle zusammen direkt an den ComboBox, indem die <FontFamily> Objekte vermeiden:

<ComboBox DockPanel.Dock="Top" x:Name="Fonttype" SelectedIndex="0"> 
    <FontFamily>Arial</FontFamily> 
    <FontFamily>Segoe UI</FontFamily>    
</ComboBox> 

Und dann binden an SelectedValue ohne ein Konverter.

FontFamily="{Binding Path=SelectedValue, ElementName=Fonttype, Mode=OneWay}" 

Oder vielleicht möchten Sie automatisch eine Liste der installierten Schriftarten erhalten möchte:

<ComboBox DockPanel.Dock="Top" x:Name="Fonttype" ItemsSource="{x:Static Fonts.SystemFontFamilies}" SelectedIndex="0" /> 

Obwohl es unwahrscheinlich ist, dass SystemFontFamilies wird sortiert werden, so dass Sie use a CollectionViewSource to sort bräuchten.

+0

Wirklich interessant, bevor ich die Frage gestellt, ich den Ausdruck value.ToString() tatsächlich versucht, Ausgang, und ich wusste, es war „System.Windows. Media.FontFamily: Arial ", aber ich habe auch einen Wendepunkt bei der Rückkehr in die Schriftfamilie hinzugefügt, genau wie du gesagt hast, und ich fand, dass es wie erwartet korrekt war. Nun, das ist irgendwie komisch. Das Wichtigste ist, dass dein Vorschlag funktioniert, vielen Dank. – VincentZHANG

+0

@VincentZHANG erweitert die Antwort ein bisschen – bdimag

+0

Das ist ein großartiger Job, vielen Dank. Hinzufügen von als unmittelbare Kinder ist jedoch jenseits meiner Fähigkeit zu verstehen. Also, das heißt wird als gültiges Tag in XAML erkannt, oder? Wenn XAML kompiliert wird, wird ein FontFamily-Objekt konvertiert? Auf der anderen Seite, kann ich jede Klasse zu hinzufügen?wie AliceBlue und binden Sie dann diese ComboBox an das Vordergrundattribut einer TextBox. – VincentZHANG

1

Es ist nicht notwendig, einen bindenden Konverter zu verwenden.

Stattdessen können Sie die Fontfamily auf die Tag Eigenschaft jedes ComboBoxItem zuweisen. Dies würde ermöglichen es Ihnen, auch beliebige Texte für die ComboBox Elemente zu verwenden:

<ComboBox x:Name="fontFamilyComboBox" SelectedValuePath="Tag"> 
    <ComboBoxItem Content="Arial"> 
     <ComboBoxItem.Tag> 
      <FontFamily>Arial</FontFamily> 
     </ComboBoxItem.Tag> 
    </ComboBoxItem> 
    <ComboBoxItem Content="Courier"> 
     <ComboBoxItem.Tag> 
      <FontFamily>Courier New</FontFamily> 
     </ComboBoxItem.Tag> 
    </ComboBoxItem> 
</ComboBox> 

<TextBox Text="Hello, World." 
     FontFamily="{Binding SelectedValue, ElementName=fontFamilyComboBox}"/> 

Die SelectedValue Bindung auf der Fontfamily Eigenschaft direkt der Tag Unterkunft ComboBox zurück, weil SelectedValuePath="Tag" auf der ComboBox gesetzt wurde. Ohne dass die Bindung auch Fontfamily wie folgt geschrieben werden:

<TextBox Text="Hello, World." 
     FontFamily="{Binding SelectedItem.Tag, ElementName=fontFamilyComboBox}"/> 
+0

Dank, Clemens, arbeitet dieser Ansatz mit für Foreground als auch? – VincentZHANG

+0

@VincentZHANG Außerdem könntest du es einfach versuchen, was lässt dich denken, dass es nicht funktionieren würde? – Clemens

+0

Ja, guter Punkt, tut mir leid, dass ich nicht klar bin. meine Frage ist eher die Regel hinter der Szene, gibt es irgendeinen Hinweis auf diesen Mechanismus? – VincentZHANG