powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / gridsplitter + binding
6 сообщений из 6, страница 1 из 1
gridsplitter + binding
    #38057161
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверно кто-то уже сталкивался вот с чем.
У меня есть грид, в нем как минимум 3 столбца и три строки.
Есть гридсплитер.
Столбцы меня имеют биндинг, так как их содержимое я отображаю согласно определенной логике. Самое главное = что ColumnDfinition и RowDefinition имеют биндинг.
Если я сплитгритер не трогаю - то все работает гуд. Но как только я трону сплитгриттер - то биндинг убивается и строкам и столбцам задается конкертно значение.

Моя задача - оставить бизнес-логику поведения элементов грида.
Кто что стоящее может предложить?
Так как биндинг убивается - единственное что мне может помочь - это триггеры описанные к моим элементам грида. Но я от этого отказался - так как всю бизнес логику в них слишком муторно запихивать.
Самое адекватное на мой взгляд - это AttacheProperty либо ко всему гриду либо к его элементам. Более адекватного пока ничего не придумал. Кто какие идеи может подсказать?
...
Рейтинг: 0 / 0
gridsplitter + binding
    #38057316
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknownfromrus,
XAML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="{Binding Col1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition Width="*"/>
  </Grid.ColumnDefinitions>
  <TextBox
    Text="Column1"
    VerticalAlignment="Stretch"/>
  <GridSplitter
    Grid.Column="1"
    Width="2"
    Margin="2"
    Background="Black"
    HorizontalAlignment="Center"
    VerticalAlignment="Stretch"
    ResizeDirection="Columns"
    ResizeBehavior="PreviousAndNext"/>
  <TextBox
    Grid.Column="2"
    Text="Column2"
    VerticalAlignment="Stretch"/>
</Grid>


code-behind
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
public partial class MainWindow: INotifyPropertyChanged
{

  [DllImport("kernel32.dll",
    EntryPoint = "AllocConsole",
    SetLastError = true,
    CharSet = CharSet.Auto,
    CallingConvention = CallingConvention.StdCall)]
  public static extern int AllocConsole();

  public MainWindow()
  {
    InitializeComponent();
    AllocConsole();
    DataContext = this;
  }

  GridLength _col1 = new GridLength(400);
  public GridLength Col1
  {
    get { return _col1; }
    set
    {
      _col1 = value;
      RaisePropertyChanged("Col1");
      Console.WriteLine("Col1 setter");
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;
  private void RaisePropertyChanged(string propertyName)
  {
    if (PropertyChanged == null) return;
    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  }
}


- двигаем сплиттер и смотрим в консоль - биндинг на месте.
...
Рейтинг: 0 / 0
gridsplitter + binding
    #38057770
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Ты ограничился только проверкой OnPropertyChanged в свойстве?
Ну так я в курсе что там происходит событие.
А ты глянь что на самом деле происходит в в окне пользователя/
Короче не работает этот вариант.
То что Binding как таковой не держится (он может пересоздаваться каждый раз) - это даже на сайте майкрософт пишут - про GridSplitter.
Тот вариант что ты предложил - там каждый раз значение сбрасывается в 0 (если параметр FallBack у меня равен 0).
...
Рейтинг: 0 / 0
gridsplitter + binding
    #38058450
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknownfromrusКороче не работает этот вариант.
УМВР.
XAML
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
<Grid>
  <Grid.RowDefinitions>
    <RowDefinition />
    <RowDefinition Height="Auto"/>
  </Grid.RowDefinitions>
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="{Binding Col1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
      <ColumnDefinition Width="Auto"/>
      <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBox
      Text="Column1"
      VerticalAlignment="Stretch"/>
    <GridSplitter
      Grid.Column="1"
      Width="2"
      Margin="2"
      Background="Black"
      HorizontalAlignment="Center"
      VerticalAlignment="Stretch"
      ResizeDirection="Columns"
      ResizeBehavior="PreviousAndNext"/>
    <TextBox
      Grid.Column="2"
      Text="Column2"
      VerticalAlignment="Stretch"/>
  </Grid>
  <Button
    Grid.Row="2"
    Content="test"
    HorizontalAlignment="Center"
    VerticalAlignment="Center"
    Margin="10"
    Command="{Binding TestCommand}"/>
</Grid>


code behind
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
public partial class MainWindow: INotifyPropertyChanged
{
  [DllImport("kernel32.dll",
    EntryPoint = "AllocConsole",
    SetLastError = true,
    CharSet = CharSet.Auto,
    CallingConvention = CallingConvention.StdCall)]
  public static extern int AllocConsole();

  public MainWindow()
  {
    InitializeComponent();
    AllocConsole();
    TestCommand = new TestCommand(()=>Col1 = new GridLength(Col1.Value+50));
    DataContext = this;
  }

  public TestCommand TestCommand {get; private set;}

  GridLength _col1 = new GridLength(400);

  public GridLength Col1
  {
    get { return _col1; }
    set
    {
      _col1 = value;
      RaisePropertyChanged("Col1");
      Console.WriteLine("Col1 setter");
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;
  private void RaisePropertyChanged(string propertyName)
  {
    if (PropertyChanged == null) return;
    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  }
}

public class TestCommand: ICommand
{
  readonly Action _action;
  public TestCommand(Action action)
  {
    _action = action;
  }
  public void Execute(object parameter)
  {
    _action();
  }

  public bool CanExecute(object parameter)
  {
    return true;
  }

  public event EventHandler CanExecuteChanged;
}


unknownfromrusТы ограничился только проверкой OnPropertyChanged в свойстве?
Специально ради Вас - см. кнопку test, демонстрирующую факт того, что биндинг жив.
...
Рейтинг: 0 / 0
gridsplitter + binding
    #38058644
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Не знаю что и сказать.
Может от версии фреймворка зависит. Хотя у меня 4.0 + SP1. Запустил твой проект - который ты прикрепил (код скопировал).
Вообще ничего не происходит при клике на кнопке - что до движения гридсплитера, что после.
...
Рейтинг: 0 / 0
gridsplitter + binding
    #38058653
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Для себря решил вопрос через AttaceProperty
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / gridsplitter + binding
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]