Ответы пользователя Alexander - CodeHelper

Alexander

Alexander
Карма 1361
Имя Ояябу!
Возраст 27
Сайт Неизвестно
Twitter Неизвестно
Участвует в проекте 1112 дн., 19 час., 32 мин.
Последняя активность 503 дн., 2 час., 41 мин. назад
Ух какой!

Ответы

Новые Лучшие
1
2
3
4
5
Перейти к вопросу →

Вот неплохо описана ответственность ViewModel:

Модель определена так же, как и в MVC; это данные или бизнес-логика, полностью независимые от UI, которые хранят и изменяют свое внутреннее состояние (хз, как прально перевести "does the processing of the problem domain"). Модель полностью описана кодом или представлена чистыми данными в виде взаимосвязаных таблиц или XML-данных.

Вид в концепции MVVM состоит из визуальных элементов, кнопок там, окошек всяких, графических элементов и более сложных элементов GUI. Он обрабатывает нажатия клавиш, да и вообще занимается взаимодействием с внешними устройствами ввода данных, что является областью ответственности контроллера в MVC (то, что действительно произошло с контроллером в современной разработке GUI - это отдельный и непростой вопрос... я предпочитаю думать, что он отступил на задний план. Контроллер в том виде, что описан в концепции MVC по-прежнему существует, однако играет уже совсем не такую значимую роль, как то было в 1979 году). Вид сейчас почти всегда объявляется декларативно, очень часто при помощи какой-то специализированной утилиты. Из-за особенностей таких утилит и вообще декларативного стиля некоторые состояния вида, которые MVC легко хранит в присущих ей классах видов, непросто реализовать. Например, UI может иметь множественные состояния, такие как "режим просмотра" и "режим редактирования", которые влияют на поведение визуальных элементов или на сам их вид, однако эти состояния не всегда можно выразить только лишь в виде XAML разметки (хотя и существует такая клевая штука, как триггеры).

Вот тут и вступает в игру привязка данных. В простых примерах вид привязывается непосредственно к модели. Часть ее просто отображается в виде путем однонаправленной привязки данных. Другие части модели могут быть отредактированы путем двунаправленной привязки контролов вида к данным модели. Например, свойства типа Boolean в модели могут быть привязаны к CheckBox'ам, или строковые поля - к TextBox'ам.

Перейти к вопросу →

Посмотри вот это к примеру:

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Xml Data Binding" FontSize="20"
    >
  <StackPanel Orientation="Horizontal">
    <StackPanel.Resources>
      <Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}">
        <Setter Property="Template">
          <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
              <Grid>
                <ContentPresenter />
                <TextBox Name="EditableText" Visibility="Collapsed"/>
              </Grid>
              <ControlTemplate.Triggers>
                <Trigger Property="IsSelected" Value="true">
                  <Setter TargetName="EditableText" Property="Visibility" Value="Visible" />
                  <Setter TargetName="EditableText" Property="Text" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}"/>
                </Trigger>
              </ControlTemplate.Triggers>
            </ControlTemplate>
          </Setter.Value>
        </Setter>
      </Style>
    </StackPanel.Resources>
    <ListBox Width="100" Height="155">
      <ListBoxItem>Item 1</ListBoxItem>
      <ListBoxItem>Item 2</ListBoxItem>
      <ListBoxItem>Item 3</ListBoxItem>
    </ListBox>
    <ListBox Width="100" Height="155">
      <ListBoxItem>Item 1</ListBoxItem>
      <ListBoxItem>Item 2</ListBoxItem>
      <ListBoxItem>Item 3</ListBoxItem>
    </ListBox>
  </StackPanel>
</Page>
Перейти к вопросу →

Причем обойтись одним поиском для вложенных шаблонов не получится.

Перейти к вопросу →

Вариант с ControlTemplate.

Имеем следующее описание стиля кнопки:

<Style TargetType="{x:Type Button}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Button}">
        <Grid Margin="5" Name="grid">
          <Ellipse Stroke="DarkBlue" StrokeThickness="2">
            <Ellipse.Fill>
              <RadialGradientBrush Center="0.3,0.2" RadiusX="0.5" RadiusY="0.5">
                <GradientStop Color="Azure" Offset="0.1" />
                <GradientStop Color="CornflowerBlue" Offset="1.1" />
              </RadialGradientBrush>
            </Ellipse.Fill>
          </Ellipse>
          <ContentPresenter Name="content" Margin="10"
                            HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

В таком случае к сетке внутри кнопки можно обратиться так:

// Finding the grid that is generated by the ControlTemplate of the Button
Grid gridInTemplate = (Grid)myButton1.Template.FindName("grid", myButton1);

// Do something to the ControlTemplate-generated grid
MessageBox.Show("The actual width of the grid in the ControlTemplate: "
    + gridInTemplate.GetValue(Grid.ActualWidthProperty).ToString());
Перейти к вопросу →

Вариант с DataTemplate

Имеем следующее описание для ListBox:

<ListBox Name="myListBox" ItemTemplate="{StaticResource myDataTemplate}"
         IsSynchronizedWithCurrentItem="True">
  <ListBox.ItemsSource>
    <Binding Source="{StaticResource InventoryData}" XPath="Books/Book"/>
  </ListBox.ItemsSource>
</ListBox>

описание используемого шаблона следующее:

<DataTemplate x:Key="myDataTemplate">
  <TextBlock Name="textBlock" FontSize="14" Foreground="Blue">
    <TextBlock.Text>
      <Binding XPath="Title"/>
    </TextBlock.Text>
  </TextBlock>
</DataTemplate>

тогда в runtime к данному текстовому блоку можно обратиться следующим образом:

// Getting the currently selected ListBoxItem
// Note that the ListBox must have
// IsSynchronizedWithCurrentItem set to True for this to work
ListBoxItem myListBoxItem =
    (ListBoxItem)(myListBox.ItemContainerGenerator.ContainerFromItem(myListBox.Items.CurrentItem));

// Getting the ContentPresenter of myListBoxItem
ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(myListBoxItem);

// Finding textBlock from the DataTemplate that is set on that ContentPresenter
DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
TextBlock myTextBlock = (TextBlock)myDataTemplate.FindName("textBlock", myContentPresenter);

// Do something to the DataTemplate-generated TextBlock
MessageBox.Show("The text of the TextBlock of the selected list item: "
    + myTextBlock.Text);

Реализация метода FindVisualChild следующая:

private childItem FindVisualChild<childItem>(DependencyObject obj)
    where childItem : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if (child != null && child is childItem)
            return (childItem)child;
        else
        {
            childItem childOfChild = FindVisualChild<childItem>(child);
            if (childOfChild != null)
                return childOfChild;
        }
    }
    return null;
}
Перейти к вопросу →
  1. Можно создать аналог множества, основанный на Hashtable.

  2. Так же можно использовать атрибут Flags для представления "подмножества" перечисления. Однако остается открытым вопрос реализации операций над множествами, без которых такое решение не имеет смысла.

Похоже, стоит искать другой подход к решению исходной проблемы.

Перейти к вопросу →

Об OpenFileDialog в справке:

Most of the functionality for this class is found in the FileDialog class.

If you want to give the user the ability to select a folder instead of a file, use FolderBrowserDialog instead.

Перейти к вопросу →

Самое простое:

string path = @"бла-бла-бла дирректория";
FileInfo fi = new FileInfo(path);
if (fi.Exists){
   //значит файл
}
else{
   DirectoryIndo di = new DirectoryInfo(path);
   //аналогично
}
Перейти к вопросу →

Sybase PowerDesigner - отличная вещь. На все случаи жизни + куча плагинов под разные цели. Правда платная. Или вот еще:

  1. Microsoft Visio. http://office.microsoft.com/en-us/FX010857981033.aspx
  2. Sparx Enterprise Architect Professional. http://www.sparxsystems.com.au

1
2
3
4
5
v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.