【问题标题】:DataBind ListBox SelectedItem to RichTextBoxDataBind ListBox SelectedItem 到 RichTextBox
【发布时间】:2015-10-23 05:32:40
【问题描述】:

我有一个填充 ListBox 的对象,我希望当我单击一个项目时将其内容写入 RichTextBox,如下所示:

标题:bla bla

艺术家:bla bla bla

类型:...

类型:...

这是对象:

public class Multimedia : INotifyPropertyChanged {
    public enum MediaType {
        CD,
        DVD
    };
    public string _title { get; private set; }
    public string _artist { get; private set; }
    public string _genre { get; private set; }
    public MediaType _type { get; private set; }

    public event PropertyChangedEventHandler PropertyChanged;
}

这是多媒体对象的集合:

public class MultiMediaList : ObservableCollection<Multimedia> {
    public MultiMediaList() {

    }
}

还有 MainWindows 类

        Multimedia m1 = new Multimedia("Play", "Moby", "Techno", Multimedia.MediaType.CD);
        Multimedia m2 = new Multimedia("18", "Moby", "Techno", Multimedia.MediaType.CD);
        Multimedia m3 = new Multimedia("The Inevitable End", "Royksopp", "Electro", Multimedia.MediaType.CD);

        multimediaList.Add(m1);
        multimediaList.Add(m2);
        multimediaList.Add(m3);

        List<Multimedia> list = new List<Multimedia>();
        list.Add(m1);
        list.Add(m2);
        list.Add(m3);



        DataContext = multimediaList;
        InitializeComponent();
        listBox1.ItemsSource = multimediaList;

还有 XAML:

    <Grid Name="grid1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition Width="5" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <ListBox Grid.Column="0" Name="listBox1">

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="0,2">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="100" />
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding _artist}" />

                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <GridSplitter Name="gridSplitter1" Margin="0" Width="5" Grid.Column="1" HorizontalAlignment="Left" />

        <RichTextBox Grid.Column="2" Name="richTextBox1" DataContext="{Binding ElementName=listBox1, Path=SelectedItem.Name }"/>


    </Grid>

【问题讨论】:

  • 为什么要使用 RichTextBox?

标签: c# wpf


【解决方案1】:

使用文本块,这很容易通过正确的绑定路径实现

<Grid Grid.Column="2">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <TextBlock Text="{Binding ElementName=listBox1, Path=SelectedItem._title}"/>
    <TextBlock Grid.Row="1" Text="{Binding ElementName=listBox1, Path=SelectedItem._artist}"/>
    <TextBlock Grid.Row="2" Text="{Binding ElementName=listBox1, Path=SelectedItem._genre}"/>
    <TextBlock Grid.Row="3" Text="{Binding ElementName=listBox1, Path=SelectedItem._type}"/>
</Grid>

使用富文本框有点棘手,您可以使用 Marlon Grech 的 RichTextBoxHelper 的修改版本,如下所示(注意 xaml 中的本地命名空间引用)

RichTextBoxHelper.cs:

public class RichTextBoxHelper
{
    #region Text

    /// <summary>
    /// Text Attached Dependency Property
    /// </summary>
    public static readonly DependencyProperty TextProperty =
        DependencyProperty.RegisterAttached("Text", typeof(string), typeof(RichTextBoxHelper),
            new FrameworkPropertyMetadata((string)null,
                new PropertyChangedCallback(OnTextChanged)));

    /// <summary>
    /// Gets the Text property.  This dependency property 
    /// indicates ....
    /// </summary>
    public static string GetText(DependencyObject d)
    {
        return (string)d.GetValue(TextProperty);
    }

    /// <summary>
    /// Sets the Text property.  This dependency property 
    /// indicates ....
    /// </summary>
    public static void SetText(DependencyObject d, string value)
    {
        d.SetValue(TextProperty, value);
    }

    /// <summary>
    /// Handles changes to the Text property.
    /// </summary>
    private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        RichTextBox textBox = (RichTextBox)d;
        if (e.NewValue != null)
        {
            textBox.Document.Blocks.Clear();
            textBox.Document.Blocks.Add(new Paragraph(new Run(e.NewValue.ToString())));
        }
    }

    #endregion

    /// <summary>
    /// Returns the Text from a FlowDocument
    /// </summary>
    /// <param name="document">The document to get the text from</param>
    /// <returns>Returns a string with the text of the flow document</returns>
    public static string GetText(FlowDocument document)
    {
        return new TextRange(document.ContentStart, document.ContentEnd).Text;
    }

}

XAML:

<Window x:Class="RichTextBoxDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:RichTextBoxDemo"
    Title="Window1" Height="300" Width="300">
    <Grid Name="grid1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition Width="5" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <ListBox Grid.Column="0" x:Name="listBox1">

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="0,2">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="100" />
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding _artist}" />

                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <GridSplitter Name="gridSplitter1" Margin="0" Width="5" Grid.Column="1" HorizontalAlignment="Left" />
        <RichTextBox x:Name="textBox" Grid.Column="2" SpellCheck.IsEnabled="True" 
            local:RichTextBoxHelper.Text="{Binding ElementName=listBox1, Path=SelectedItem._title}"     />
    </Grid>
</Window>

截图:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-26
    • 2011-01-02
    • 2010-12-21
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多