Изменить DataGridTemplateColumn в коде позади? - PullRequest
2 голосов
/ 06 апреля 2011

Я бы подумал, что это будет невероятно просто, но я искал все и не могу найти ответ.У меня есть DataGridTemplateColumn, который я хочу использовать для отображения значения, которого нет в DataContext из DataGrid.Т.е. у меня есть сущность, у которой разные имена в зависимости от культуры.Когда сетка загрузится, я хочу получить соответствующее имя на основе текущей культуры.Каждый раз, когда я вижу что-то о DataGridTemplateColumn s, они всегда используют синтаксис Binding.Я не могу сделать это здесь.Какой код C # мне нужен для доступа к TextBlock "nameValue" в следующем XAML, и в каком обработчике событий я должен получить к нему доступ:

<Datagrid:DataGridTemplateColumn Header="Name" x:Name="nameField">
    <Datagrid:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock x:Name="nameValue" />
            </StackPanel>
        </DataTemplate>
    </Datagrid:DataGridTemplateColumn.CellTemplate>
</Datagrid:DataGridTemplateColumn>

Спасибо всем заранее, и я извиняюсь за суперn00b вопрос.

1 Ответ

1 голос
/ 24 мая 2011

Вы все еще можете использовать синтаксис привязки, похоже, вам просто нужно привязать к статическому методу вместо контекста данных сетки.Здесь есть хороший справочник http://blog.mrlacey.co.uk/2011/03/binding-to-static-classes-in-windows.html Взяв это в качестве примера и изменив для своего случая.

Первый: Настройте свою сетку, как обычно, источник элемента и столбцы,стандартная привязка данных.Это позаботится о любых столбцах, которые вам нужны из базы данных или другого источника.

Second : В ваш проект добавьте статический класс

namespace StaticBinding
{
        public class MyStaticClass
        {   
            private static string myStaticProperty;
            public static string MyStaticProperty
                {
                    get
                    {    return 
                            (CultureInfo.CurrentCulture.Name == "en-US" ? "US" : "Other");
                    }
                set { myStaticProperty = value; } }
        }
} 

Third: Добавьте ваш новый ресурс к ресурсам приложения

 <Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         xmlns:SampleData="clr-namespace:Expression.Blend.SampleData.SampleDataSource" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" 
         x:Class="SilverlightApplication28.App"
         xmlns:myns="clr-namespace:StaticBinding"
         >
<Application.Resources>
    <myns:MyStaticClass x:Name="MyStaticClass"></myns:MyStaticClass>
</Application.Resources>

Наконец: Установите привязку в TextBlock, если вы создали свой проект, вы должны увидеть свойство в окне редактора привязок.

   <sdk:DataGrid AutoGenerateColumns="False" Height="171" HorizontalAlignment="Left" Margin="61,53,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="263" ItemsSource="{Binding Collection}" LoadingRow="dataGrid1_LoadingRow"   Loaded="dataGrid1_Loaded"     >
        <sdk:DataGrid.Columns>
            <sdk:DataGridTextColumn Binding="{Binding Property1}" Header="Property1"/>
            <sdk:DataGridCheckBoxColumn Binding="{Binding Property2}" Header="Property2"/>
            <sdk:DataGridTextColumn Binding="{Binding Property3}" Header="Property3"/>
            <sdk:DataGridTemplateColumn>
                <sdk:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock x:Name="nameValue" Text="{Binding Source={StaticResource MyStaticClass}, Path=MyStaticProperty}" />
                        </StackPanel>
                    </DataTemplate>
                </sdk:DataGridTemplateColumn.CellTemplate>
            </sdk:DataGridTemplateColumn>
        </sdk:DataGrid.Columns>
    </sdk:DataGrid>
...