LINUX.ORG.RU

Тебе надо сделать свой класс с нужными properties и засунуть ссылку на его инстанс в DataContext контрола, где нужен доступ к твоим properties. VS нету у меня сейчас (и не предвидится в ближайшее время), так что примера не будет.

П.С. Не пиши на F# + WPF, лучше сделай так WPF + C# и из этой обёртки дёргай F# код, будет проще и в разы быстрее.

Norgat ★★★★★
()
Ответ на: комментарий от basp

ок, поправил.

What should do to set DataContext of childs of the control at any depth?

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от Norgat

Тебе надо сделать свой класс с нужными properties и засунуть ссылку на его инстанс в DataContext контрола, где нужен доступ к твоим properties.

я знаю, в примере этот класс называется AppViewModel. Но контрол, в котором нужно установить DataContext, находится не на верхнем уровне приложения и описан во вложенных в xaml файлах, типа <Frame Source=«abc.xaml»/>.

и в разы быстрее.

почему?

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

почему?

Потому что WPF разрабатывался под C# и в студия генерит дополнительный код для той ж загрузки xaml.

То, что ты хочешь, на C#, можно сделать примерно так:

<Window x:Class="LORWPF.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:z="clr-namespace:LORWPF"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <z:MyControl x:Name="TF"/>
    </Grid>
</Window>
namespace LORWPF
{
    public class TextField
    {
        public TextField() { }

        public string TextF { get; set; }
    }

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

            this.TF.DataContext = new TextField { TextF = "Hello world" };
        }

    }
}
<UserControl x:Class="LORWPF.MyControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="178" Width="388">
    <Grid Height="159" Width="359">
        <TextBlock Text="{Binding Path=TextF}" />
    </Grid>
</UserControl>

С F# тебе ещё придётся руками грузить xaml + руками прибивать свои классы к нему (хотя тут я могу заблуждаться, но поверхностный гуглинг ничего окромя детских примерчиков с ручной загрузкой xaml не выдал).

Norgat ★★★★★
()
Ответ на: комментарий от Norgat

П.С. из того кода, что я привёл следует простой вывод - дай своему контролу имя и по этому имени выставляй его DataContext.

Norgat ★★★★★
()
Ответ на: комментарий от Norgat

на C# я могу и просто создать статический объект в качестве модели и присваивать его в каждом конструкторе (класса представляющего xaml) DataContext-у. Типо


    public partial class TestsInfo : UserControl
    {
        public TestsInfo()
        {
            InitializeComponent();

            this.DataContext = ViewModel.Model;
        }
    }

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от Norgat

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

К примеру в линуксе я всегда знаю, что установлена переменная HOME, и могу написать что-то типа $HOME+"./my-program-files/". Следовательно относительно одного пользователя она будет неизменна. Задать переменную можно и в винде, но может там по-другому как-то принято, я редко ей пользуюсь.

pseudo-cat ★★★
() автор топика

В похожей ситуации я накидал простую программу на С#, а потом рефлектором посмотрел как нужно грузить ручками XAML из F#. Наверняка, там что-то делается эдакое, особенно со связыванием.

dave ★★★★★
()
Ответ на: комментарий от dave

как же я не люблю копаться в таких вещах. Сделал врапер на С№, так проще

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

Такие файлы принято хранить в C:\ Documents and Settings\$UserName\Application Data

Вот кусок кода, который выдаст корретный путь для текущего пользователя:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

Взято отсюда: http://msdn.microsoft.com/ru-ru/library/system.environment.specialfolder.aspx

Есть ещё переменные среды. Их можно выставить глобально и для конкретного юзера. С ходу не нагуглил как с ними работать из C# (ну и слегка лень).

Ну и ещё есть реестр, там тоже записи можно делать: http://lotus.communityhost.ru/thread/?thread__mid=807665393

Имхо, самый корректный способ - через AppData.

Norgat ★★★★★
()
Ответ на: комментарий от Norgat

а ещё, как гарантированно получить путь к исполняемому файлу(в его коде), просто ярлыки в винде какие-то странные, даже если задать рабочую директорию где лежит исполняемый файл, всё равно относительный путь будет строится из директории где лежал ярлык

pseudo-cat ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.