@mississippi

Как привязать данные разного типа к одному элементу управления и выводить в зависимости от определенного условия?

Вот если у меня есть окошко, в котором я хочу вывести, допустим, числовые данные, при этом элемент управления и источник данных связаны(Binding), а при определенных условиях мне нужно в этом же месте вывести строку. Как это сделать? Сделать две привязки к одному элементу? Или для каждого источника данных сделать отдельный элемент и выводить его при определенном условии?
Интерфейс пишу в XAML. Использую mvvm.
  • Вопрос задан
  • 98 просмотров
Пригласить эксперта
Ответы на вопрос 3
@tex0
Вам поможет DataTemplateSelector

ещё немного примеров
Ответ написан
Комментировать
lexxpavlov
@lexxpavlov
Программист, преподаватель
Можно сделать шаблоны DataTemplate, которые изменят шаблон нужного типа:
<Window x:Class="TestApp.MainWindow"
        xmlns:testApp="clr-namespace:TestApp"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <DataTemplate DataType="{x:Type testApp:TestInt}">
            <TextBlock Text="{Binding Value}" Background="Red"/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type testApp:TestStr}">
            <TextBlock Text="{Binding Value}" Background="Yellow"/>
        </DataTemplate>
    </Window.Resources>
    <StackPanel>
            <ContentControl Content="{Binding Test1}"/>
            <ContentControl Content="{Binding Test2}"/>
            <ListBox ItemsSource="{Binding TestList}"/>
    </StackPanel>
</Window>

public class TestInt
{
    public int Value { get; set; }
}
public class TestStr
{
    public string Value { get; set; }
}
public partial class MainWindow : Window
{
    public TestInt Test1 { get; set; }
    public TestStr Test2 { get; set; }
    public List<object> TestList { get; set; } 

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        Test1 = new TestInt { Value = 123 };
        Test2 = new TestStr { Value = "asd" };
        TestList = new List<object> { Test1, Test2 };
    }


Чтобы даташаблоны автоматически подключались, тип нужно указывать через DataType="{x:Type testApp:TestInt}", а не через DataType="testApp:TestInt"
Ответ написан
Комментировать
FoggyFinder
@FoggyFinder
Возможно вам подойдут триггеры данных.

Например, вы хотите отобразить сообщение о том, что нет данных для отображения, если коллекция числовых данных пуста:

<ListBox ItemsSource="{Binding CurrentData}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding .}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.Style>
        <Style TargetType="ListBox">
            <Style.Triggers>
                <Trigger Property="HasItems" Value="False">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <TextBlock
                                    Margin="5"
                                    HorizontalAlignment="Center"
                                    VerticalAlignment="Center"
                                    FontSize="16"
                                    Text="{Binding StringIfEmpty}" />
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.Style>
</ListBox>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы