相关疑难解决方法(0)

绑定在WPF数据网格文本列中

我正在尝试构建一个数据网格,其中一列是以该字体显示的字体名称.以前,我正在使用列表框,我在其中定义了以下模板:

<TextBlock Text="{Binding Path=Name}" FontFamily="{Binding Path=Name}"/>
Run Code Online (Sandbox Code Playgroud)

这很好用.所以,我调整了数据结构(Name变为Font.Name)并移动到数据网格上试试这个:

<dg:DataGridTextColumn Binding="{Binding Font.Name}" 
    FontFamily="{Binding Font.Name}" IsReadOnly="True" Header="Font"/>
Run Code Online (Sandbox Code Playgroud)

现在字体名称都以默认字体显示,我收到此错误:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or 
FrameworkContentElement for target element. 
BindingExpression:Path=Font.Name; DataItem=null; target element is 
'DataGridTextColumn' (HashCode=56915998); target property is 'FontFamily' 
(type 'FontFamily')
Run Code Online (Sandbox Code Playgroud)

处理自定义控件的一些Google结果建议将属性从DependencyObject更改为FrameworkElement,但是我必须继承DataGridTextColumn并定义我自己的属性才能这样做 - 必须有更好的方法.

我尝试了几种不同的绑定方法,包括尝试在我的数据类中使用distinct属性更改字体大小(即FontSize="{Binding FontSize}").它们都导致了与上面相同的错误.

谁知道我在做错了什么?

编辑:

感谢Jared的回复,我发现了以下内容:

http://blogs.msdn.com/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

该方法看起来很合理,但我需要创建一个绑定,引用每行的DataContext中的正确元素,而不是为整个列共享单个值.

代码背后:

fontDataGrid.DataContext = from font 
    in new InstalledFontCollection().Families;
Run Code Online (Sandbox Code Playgroud)

XAML:

Binding="{Binding Font.Name}"
FontFamily="{Binding (FrameworkElement.DataContext).Font.Name, 
    RelativeSource={x:Static RelativeSource.Self}}"
Run Code Online (Sandbox Code Playgroud)

使用上面的XAML显然不正确,因为DataContext是整个字体集合.但我不能索引集合,因为我不知道行号是什么(或者我?).我可以用一些方法来实现这个目标吗?

第二个问题 - 为什么即使没有DataContext,Binding属性似乎也能正常工作?它是在寻找ItemsSource吗?

.net data-binding wpf xaml datagrid

26
推荐指数
1
解决办法
6万
查看次数

绑定DataGridComboBoxColumn

我试图将ObservableCollection的T绑定到DataGrid的DataGridComboBoxColumn.
DataGrid定义是:

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Model, IsAsync=True}">

     <DataGrid.Columns>
         <DataGridTextColumn  Header="Column Entry"  IsReadOnly="True" Binding="{Binding ColumnName}"/>
         <DataGridComboBoxColumn Header="Road Type" ItemsSource="{Binding RoadTypes}"/>
    </DataGrid.Columns>

</DataGrid>
Run Code Online (Sandbox Code Playgroud)

这是ViewModel和Model

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        var viewModel = new ViewModel();
        DataContext = viewModel;
    }
}

public class ViewModel : ViewModelBase
{
    private ObservableCollection<Model> _model;

    public ViewModel()
    {
        var list = new List<Model>();
        var roadTypes = new ObservableCollection<RoadType>
                            {
                                new RoadType
                                    {
                                        Code = 1,
                                        Id = 1,
                                        Name = "Name1"
                                    },
                                new …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml binding datagrid

2
推荐指数
1
解决办法
2万
查看次数

标签 统计

datagrid ×2

wpf ×2

xaml ×2

.net ×1

binding ×1

c# ×1

data-binding ×1