Привязка в WPF

WPF
  1. 6 года назад
    Добавлено 6 года назад liquid

    Для нового проекта начал изучать WPF, до этого работал с формами. Возникли пару вопросов по привязки:
    - Компилировал пример из этой главы http://professorweb.ru/my/WPF/binding_and_styles_WPF/level8/8_6.php - выдает ошибки при компиляции

    <TextBox Name="txt" Margin="10" MinHeight="26" VerticalContentAlignment="Center"
            Text="{Binding Source={x:Static SystemFonts.IconFontFamily}, Path=Source}"></TextBox>

    или этот

    <TextBox Name="txt" Margin="10" MinHeight="26" VerticalContentAlignment="Center"
               Text="{Binding Source={StaticResource ResourceKey=CustomFont}, Path=Source}"></TextBox>

    -image-
    Таже самая привязка только в TextBlock работает нормально.

    - Еще такой вопрос. Допустим у меня в коде главного окна объявлена переменная, например стринг. Как можно ее значение привязать к текстовому полю в окне?

  2. Alexandr_Erohin

    Dec 6 Администратор
    1. Ошибка в примере, нужно привязывать свойство FontFamily, а не Text. Исправил код в статье.
    2. Во-первых для привязки данных из кода необходимо использовать общедоступные свойства, вместо переменных. Во-вторых для привязки нужно задать контекст данных. Вот простой пример:

    XAML:

    ...
    <TextBox x:Name="txt" Text="{Binding Path=SomeText}"></TextBox>

    C#:

    public partial class MainWindow : Window
    {
            string sometext = "Text";
    
            public string SomeText
            {
                get { return sometext; }
                set { sometext = value; }
            }
    
            public MainWindow()
            {
                InitializeComponent();
    
                txt.DataContext = this;
            }
    }

    Для привязки данных в списковых элементах управления, например ListBox или DataGrid используется свойство ItemsSource вместо DataContext. Пример я приводил в теме - Настройка столбцов DataGridView

  3. Спасибо за быстрый ответ, а также за ресурс в целом - много полезной и хорошо понятной информации.

  4. Еще один вопрос по теме. Хотел сделать пример из главы про Текст Бокс, только с помощью привязки, но не получил результат. Не подскажите в чем ошибка?

    <TextBox TextWrapping="Wrap" Padding="5" AutoWordSelection="True" Name="txt"
                    SelectionChanged="TextBox_SelectionChanged">
                    Формально сущность, используемая для хранения набора вычисляемых значений, 
                    называется виртуальным стеком выполнения ...
                    </TextBox>
    
    <TextBlock TextWrapping="Wrap" Margin="5" Text="{Binding ElementName=txt, Path=SelectedText, Mode=OneWay}"></TextBlock>
  5. Alexandr_Erohin

    Dec 9 Администратор

    Свойство SelectedText не является свойством зависимости, поэтому в привязке работать не будет, т.к. не передает состояние

  6. Еще один вопрос по этой же теме, теперь привязка данных к лист боксу:
    У меня есть простой класс:

       public class TestClass
        {
            public string Name { get; set; }
            public string ID { get; set; }
    
            public TestClass(string name, string id)
            {
                Name = name;
                ID = id;
            }
    
            public override string ToString()
            {
                return String.Format("Test Class {0} : {1} ", Name, ID);
            }
        }

    А также лист бокс куда я хочу его вывести:

                <ListBox ItemsSource="{Binding}" Name="mList" >
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Label Content="{Binding Name}"/>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

    В коде окна пишу следующие

     public List<TestClass> MYList = new List<TestClass>();
    
                MYList.Add(new TestClass("Name_1", "111"));
                MYList.Add(new TestClass("Name_2", "101"));
                MYList.Add(new TestClass("Name_3", "103"));
                mList.DataContext = MYList;

    Так все отлично работает. Меня интересует как можно строку mList.DataContext = MYList перенести из кода в XALM разметку.

  7. Alexandr_Erohin

    Dec 24 Администратор
    Добавлено 6 года назад Alexandr_Erohin

    Для списковых элементов управления (ListBox, ListView, DataGrid) использование DataContext не оправдано, нужно пользоваться свойством ItemsSource. Вот пример, как его задать из XAML:

    <Window ... x:Name="Window">
        <ListBox ItemsSource="{Binding ElementName=Window, Path=getMYList}" Name="mList" >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Label Content="{Binding Path=Name}"></Label>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
    </Window>

    Как я написал выше, в разметке разрешается привязывать только общедоступные свойства, вместо переменных, поэтому вот видоизмененный код:

    public partial class MainWindow : Window
    {
            public List<TestClass> getMYList
            {
                get
                {
                    return new List<TestClass>
                    {
                        new TestClass("Name_1", "111"),
                        new TestClass("Name_2", "101"),
                        new TestClass("Name_3", "103")
                    };
                }
             }
    ...
  8. Добавлено 6 года назад Chardash

    Здравствуйте! Подскажите пожалуйста, можно ли использовать Expression Blend для создания графического интерфейса для консольных программок на фортране? и стоит ли овчинка выделки? извиняюсь, если что за нубский вопрос, но уж очень удобно делать кнопки и меню в этой программе)

  9. Alexandr_Erohin

    Dec 24 Администратор
    Добавлено 6 года назад Alexandr_Erohin

    Эт как? o_O Фортран портирован на .NET?

  10. Добавлено 6 года назад Chardash

    Найти это сообщение Alexandr_Erohin Эт как? o_O Фортран портирован на .NET?

    не выйдет? ( жаль. по учебе в аспир стало необходимо изучить фортран, учусь на интел фортране, в нем есть примеры с wpf. но не на с #

    вот тут еще говорят про это
    http://stackoverflow.com/questions/4808025/can-fortran-interact-with-silverlight-wpf-or-mfc-on-windows

  11. Alexandr_Erohin

    Dec 24 Администратор

    В .NET есть CLS. Если есть реализация фортрана для .NET, то конечно можно писать любые приложения для .NET (как например C#, Visual Basic, IronPython и т.д.)

  12. Добавлено 6 года назад Chardash

    Спасибо за быстрые ответы. С уважением
    Еще раз здравствуйте! а есть какие то примеры по XAML-фортран?

  13. Еще раз здравствуйте! а есть какие то примеры по XAML-фортран?

  14. Добрый день! У меня вопрос.
    есть DataGrid, в который выводится результат запроса LINQ следующим образом: gridAssortment.DataContext = AllrecordsInTable;
    В DataGrid созданы колонки, в которых есть привязка к данным из этого запроса. Я создал еще одну колонку в DataGrid , в которой хочу выводить другую цену, т.е. есть инфа в БД - цена в RUR, я хочу выводить на основании этой цены - цену в долларах, но цену в долларах в БД хранить незачем. Нужно чтобы она вычислялась на основании другой колонки с ценой. Как это реализовать с помощью привязки??? (Можно конечно создать промежуточный класс, в который помещать эти данные и вычислять еще одно свойство на основании другого - но я думаю это не рационально. Есть же привязка!! :) ).
    Заранее спасибо!

  15. Найти это сообщение mustang1_11 Добрый день! У меня вопрос.
    есть DataGrid, в который выводится результат запроса LINQ следующим образом: gridAssortment.DataContext = AllrecordsInTable;
    В DataGrid созданы колонки, в которых есть привязка к данным из этого запроса. Я создал еще одну колонку в DataGrid , в которой хочу выводить другую цену, т.е. есть инфа в БД - цена в RUR, я хочу выводить на основании этой цены - цену в долларах, но цену в долларах в БД хранить незачем. Нужно чтобы она вычислялась на основании другой колонки с ценой. Как это реализовать с помощью привязки??? (Можно конечно создать промежуточный класс, в который помещать эти данные и вычислять еще одно свойство на основании другого - но я думаю это не рационально. Есть же привязка!! :) ).
    Заранее спасибо!

    На мздне есть пример именно под ваш вопрос. функция конвертер помоему называется

или зарегистрируйтесь чтобы ответить