Как связать данные из One control и Bind to source в переменную WPF, C # - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь привязать выбранное значение из DataGrid и показать пользователю на TextBlock.Затем свяжите его с переменной модели в исходном коде

Это небольшой пример кода, чтобы упростить показ проблемы здесь.

мой файл xaml:

<Window x:Class="WpfAppTest.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:WpfAppTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <StackPanel>
            <DataGrid x:Name="DGExample" MinWidth="50" SelectionMode="Single" FontSize="30"
                  ItemsSource="{Binding ExampleList, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">

            </DataGrid>

            <TextBlock Name="TBDescription" MinWidth="100" FontSize="30">
                <TextBlock.Text>
                    <MultiBinding StringFormat="{}{0} - {1}">
                        <Binding Path="Example" Mode="OneWayToSource" UpdateSourceTrigger="PropertyChanged" />
                        <Binding Path="SelectedItem.X" ElementName="DGExample" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
                    </MultiBinding>
                </TextBlock.Text>
            </TextBlock>

            <TextBlock Name="ShowExample" FontSize="30" Text="{Binding Path=Example, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">

            </TextBlock>
        </StackPanel>
    </Grid>
</Window>

Пример моей модели:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WpfAppTest
{
    public class ModelExample : INotifyPropertyChanged
    {
        public int Example
        {
            get;
            set;
        }

        public ObservableCollection<ClassExample> ExampleList { get; set; }

        public ModelExample()
        {
            ExampleList = new ObservableCollection<ClassExample>() { 
                new ClassExample(1,2), new ClassExample(3,4), new ClassExample(5,6)};
        }

        public event PropertyChangedEventHandler PropertyChanged;


    }
}

Класс моего примера:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WpfAppTest
{
    public class ClassExample
    {
        public ClassExample(int x, int y)
        {
            X = x;
            Y = y;
        }

        public int X{get;set;}
        public int Y{ get; set; }

    }
}

Мой поддельный файл:

<?xml version="1.0" encoding="utf-8"?>
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
  <PropertyChanged />
</Weavers>

Я ожидаю увидеть значениев TBDescription Control для примера переменной

Но единственное значение, сохраненное в примере, это только 0 ...

1 Ответ

0 голосов
/ 04 февраля 2019

Проблема вашего кода в том, что он никогда не привязывает значение к свойству Example из TextBlock, поскольку его содержимое никогда не изменяется.Поэтому, если вы просто хотите связать выбранное значение от DataGrid до Example, сделайте следующее.Создать конвертер, который преобразует ClassExample экземпляр в int

public class TestConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        ClassExample obj = value as ClassExample;
        if (obj != null)
        {
            return obj.X;
        }
        return 0;
    }
}

Добавить конвертер в Window

<Window.Resources>
    <your-namespace:TestConverter x:Key="TestConverter" />
</Window.Resources>

Добавить привязку к SelectedItem в DataGrid

<DataGrid 
    x:Name="DGExample" 
    MinWidth="50" 
    SelectionMode="Single" 
    FontSize="30"
    ItemsSource="{Binding ExampleList, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
    SelectedItem="{Binding Example, Mode=OneWayToSource, Converter={StaticResource TestConverter}}">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...