Изменить элемент управления в DataGridRow программно - PullRequest
2 голосов
/ 25 марта 2011

У меня WPF DataGrid содержит список продуктов с кнопкой изображения в последнем столбце, чтобы добавить элемент Product в коллекцию Orders_Products.Это работает.

Теперь я хотел бы заменить кнопку «Добавить» на изображение кнопкой «Удалить», если элемент Product уже находится в коллекции Orders_Products.

Я пытался использовать событие LoadingRow, но, похоже, нет доступа к объекту Image, потому что он еще не готов в событии LoadingRow ...

Я пытался использовать событие Load изображенияобъект, но он не запускается, если строка не видна в форме (когда мне нужно прокрутить сетку данных, чтобы увидеть эту строку).Он срабатывает, когда я сортирую столбец, и строка отображается в форме.Я схожу с ума ...: (

Я думаю, я не делаю что-то необычное, но я новичок в WPF и, возможно, я что-то упускаю.

Может кто-нибудь дать мне подсказкуЗаранее спасибо, Джо

PS: я использую Entity Framework.

1 Ответ

1 голос
/ 25 марта 2011

Правильный способ сделать это - привязать DataGrid к коллекции объектов, которые вы хотите отобразить (вы, вероятно, уже делаете это).

Затем вручную определите DataGridTemplateColumn и установите для CellTemplate соответствующее DataTemplate (это обычно определяется как ресурс в вашем DataGrid или где-то выше в логическом дереве элементов).

Вы можете увидеть пример того, как это делается здесь .

Внутри DataTemplate используйте технику, описанную в моем ответе на на этот вопрос , чтобы изменить то, что отображается в шаблоне путем сопоставления значения соответствующего свойства в графе данных Product.

Все это может быть сделано полностью в XAML, так как это предпочтительный способ работы в WPF.

Обновление (рабочий пример)

Product:

public class Product
{
    public string Name { get; set; }

    public bool Exists { get; set; }
}

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        this.Products = new List<Product>
            {
                new Product { Name = "Existing product", Exists = true },
                new Product { Name = "This one does not exist", Exists = false },
            };

        InitializeComponent();
        this.DataContext = this;
    }

    public IEnumerable<Product> Products { get; set; }
}

MainWindow.xaml

<Window x:Class="SandboxWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.Resources>
            <DataTemplate x:Key="ButtonColumnTemplate" >
                <ContentControl x:Name="MyContentControl" Content="{Binding}" />
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding Exists}" Value="True">
                        <Setter TargetName="MyContentControl" Property="ContentTemplate">
                            <Setter.Value>
                                <DataTemplate>
                                    <TextBlock Text="Your Remove product button goes here" />
                                </DataTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Exists}" Value="False">
                        <Setter TargetName="MyContentControl" Property="ContentTemplate">
                            <Setter.Value>
                                <DataTemplate>
                                    <TextBlock Text="Your Add product button goes here" />
                                </DataTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </Grid.Resources>
        <DataGrid ItemsSource="{Binding Products}" AutoGenerateColumns="False" CanUserAddRows="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Product Name" Binding="{Binding Name}" />
                <DataGridTemplateColumn Header="Add/Remove" CellTemplate="{StaticResource ButtonColumnTemplate}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
...