Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WPF, не связать данные (string) с button.content 
:(
    Опции темы
tavla
Дата 17.7.2010, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



нужно название кнопки подгружать динамически в зависимости от обстоятельств, 
соответственно кидаю на форму button, в C# прописываю поле с хранимым значением
Код

        private string _btnName = "dinName";
        public string btnName
        {
            get
            {
                return _btnName;
            }
            set
            {
                _btnName = value;
            }
        }

и привязываю его к content'ом кнопки:
Код

<Window x:Class="WpfApplicationTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Button Margin="102,125,101,114" Name="button1" Content="{Binding Path=btnName}"/>
    </Grid>
</Window>


при этом никакого названия на кнопке не появляется. объясните пожалуйста, где я накосячил?

Это сообщение отредактировал(а) tavla - 17.7.2010, 00:06
PM MAIL   Вверх
HalkaR
Дата 17.7.2010, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

Репутация: 5
Всего: 42



А DataContext присвоил?
PM MAIL   Вверх
tavla
Дата 17.7.2010, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



не присваивал, string btnName расположен в классе window1,  он вроде по умолчанию там ищет.
к тому же, на что делать источник - на класс window1 или на string btnName, и можно ли указать в качестве источника просто string?

вот полностью исходный код:
window1.xaml
Код

<Window x:Class="WpfApplicationTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Button Margin="102,125,101,114" Name="button1" Content="{Binding Path=btnName}"/>
        <Button Height="23" Margin="102,0,101,73" Name="button2" VerticalAlignment="Bottom" Click="button2_Click">Button</Button>
    </Grid>
</Window>


window1.xaml.cs
Код

using ...

namespace WpfApplicationTest
{
    /// <summary>
    /// Логика взаимодействия для Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        private string _btnName = "dinName";
        public string btnName
        {
            get
            {
                return _btnName;
            }
            set
            {
                _btnName = value;
            }
        }


        public Window1()
        {
            InitializeComponent();
        }
    }
}

PM MAIL   Вверх
HalkaR
Дата 17.7.2010, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

Репутация: 5
Всего: 42



Слушай, я так никогда не делал конечно, всегда дата сорс был отдельным объектом. Но попробуй зарегистрировать dependency property и заводи значения через нее.
PM MAIL   Вверх
tavla
Дата 18.7.2010, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



нашел обсуждение подобной проблеммы здесь, попытался воспроизвести и ничего не работает.
window1.xaml
Код

<Button x:Name="TheButton">
        <Button.Content>
               <TextBlock Text="{Binding Text}"/>                 
        </Button.Content>
</Button>


window1.xaml.cs
Код

public class Data
{
      public String Text { get; set; }
}

Data data = new Data() { Text = "Hello World" };
TheButton.DataContext = data;


и vs2008 и vs2010 не могут обратиться к кнопке из window1.xaml.cs по ее имени TheButton, т.е. нет обратной связи, хотя x:Name объявлен. в то же время обработчик нажатия кнопки, описанный в window1.xaml.cs, работал. что не так?
PM MAIL   Вверх
fvoice
Дата 19.7.2010, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 28.4.2009

Репутация: нет
Всего: нет



копайте в сторону INotifyPropertyChanged, вот пример:

Код

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300" Name="Window">
    <Grid DataContext="{Binding ElementName=Window}">
        <Button Content="{Binding ButtonName}" Click="ButtonBase_OnClick"/>
    </Grid>
</Window>


Код


using System.ComponentModel;
using System.Windows;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window, INotifyPropertyChanged
    {
        public Window1()
        {
            InitializeComponent();
        }

        private int _count;


        private string _buttonName;
        public string ButtonName
        {
            get
            {
                return _buttonName;
            }
            set
            {
                _buttonName = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("ButtonName"));
            }
        }

        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            _count++;
            ButtonName = _count.ToString();
        }

        #region Implementation of INotifyPropertyChanged

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion
    }
}



Это сообщение отредактировал(а) fvoice - 19.7.2010, 12:29
PM MAIL   Вверх
tavla
Дата 22.7.2010, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



действительно получилось сделать через DataContext и с помощью INotifyPropertyChanged добавить реакцию на изменение прибиндинного поля.

но возникло еще несколько вопросов:
1. допустим, у меня есть три класса, в одном из которых я создаю объекты двух других.
к DataContext можно подключить любой вложенный объект класса (DataContext = Cl3.Cl2) и затем свободно обращаться к полям этого вложенного класса, но как добраться до его полей, если подключить только верхний класс (DataContext = Cl3), а затем обращаться к полям вложенных классов как это делается в обычном коде ({binding Path=Cl3.Cl1.str1}, {binding Path=Cl3.Cl2.str2}).
Код

class Class1{ public string str1{get;set}}
class Class2{ public string str2{get;set}}
class Class3
{
       public Class1 Cl1 = new Class1();
       public Class2 Cl2 = new Class2();
}
......

public partial class Window1 : Window
{
       public Window1()
       {
              public Class3 Cl3 = new Class3();

              // если в качестве DataContext задать путь до объекта
              // класса Class2, то из xaml можно подключить текст кнопки
              // к полю str2 при помощи записи Content="{Binding Path=str2}
              this.DataContext = Cl3.Cl2;

              // а если к DataContext подключить просто объект Cl3, 
              // то добраться до поля str2 строкой
              // Content="{Binding Path=Cl2.str2} никак неполучается.
              this.DataContext = Cl3;
              .......
        }
}


2. как объект моего класса прописать ресурсом в xaml-коде. пример описанный здесь мне воссоздать не удалось - два экземпляра класса подключаются в качестве StaticResource.

Это сообщение отредактировал(а) tavla - 22.7.2010, 21:13
PM MAIL   Вверх
Kefir
Дата 3.8.2010, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 22
Всего: 87



1. В обоих случаях будет работать и получать значение str2. Я так понял, что приведенный код неполон, так что не берусь судить где у вас ошибка.
2. В корневом элементе (<Window> / <UserControl>) прописывается локальный неймспейс:
Код

<Window ...
  xmlns:local="clr-namespace:MyWpfApplication">

Теперь в ресурсах можно создать класс MyWpfApplication.SomeClass следующим образом:
Код

<local:SomeClass ... />


Напоследок - пожалуйста при возникновении очередного вопроса - создайте новую тему, а не продолжайте спрашивать в одной и той же.
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.