Связывание в зависимости от типа в WPF - PullRequest
0 голосов
/ 01 июля 2010

У меня есть ParentViewModel, который имеет ObservableCollection с именем Notices.

public class Notice
    {

        public string Content { get; set; }

        public NoticeType Type { get; set; }

    }

У меня есть статические элементы управления в пользовательском элементе управления, где я хочу привязать эту наблюдаемую коллекцию к этим статическим элементам управления.И я не знаю, как это обязательные уведомления в зависимости от его типов.Я хочу связать уведомление с типом FirstType с «первой строкой» и уведомление с типом SecondType с «второй строкой» Кроме того, если флажок пользователя установлен, уведомление должно быть удалено из коллекции.

Есть мои коды

<UserControl x:Class="Repo.UserControlNotices"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="Auto" Width="Auto">
    <Grid DataContext="{Binding}">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
 </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>

        </Grid.ColumnDefinitions>
    <TextBox Text="FirtNotice" >


     </TextBox>
<StackPanel Grid.Row="0" Grid.Column="1">
            <TextBox Text="{Binding Path =Content}" >
            </TextBox>
            <CheckBox >
            </CheckBox>
        </StackPanel>
        <TextBox Grid.Row="1" Text="SecondNotice">
        </TextBox>
        <StackPanel Grid.Row="1" Grid.Column="1">
            <TextBox Text="{Binding Path =Content}" >
            </TextBox>
            <CheckBox >
            </CheckBox>
        </StackPanel>
    </Grid>
</UserControl>


class ParentViewModel
{

    public ObservableCollection<Notice> Notices { get; set; }


    public ParentViewModel()
    {

        ObservableCollection<Notice> loadedNotices = new ObservableCollection<Notice>();


      loadedNotices.Add(new Notice() { Content = "Something", Type = NoticeType.FirstType });
loadedNotices.Add(new Notice() { Content = "Something", Type = NoticeType.SecondType });
            Notices = loadedNotices;
        }
    }

<Window x:Class="Repo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Repo="clr-namespace:Repo" Title="Window1" Height="300" Width="300">
    <Window.Resources>

        <Repo:ParentViewModel x:Key="parentVM"/>

    </Window.Resources>

    <Window.DataContext>
        <StaticResourceExtension ResourceKey="parentVM"/>
    </Window.DataContext>
    <Grid>

                            <Repo:UserControlNotices DataContext="{Binding Path=Notices}">

                            </Repo:UserControlNotices>

    </Grid>
</Window>

Это пример в winforms: альтернативный текст http://img441.imageshack.us/img441/6487/examplese.png

Ответы [ 2 ]

0 голосов
/ 01 июля 2010

Не проще ли просто иметь два свойства в ParentViewModel, например, ...

public static IEnumerable<Notice> FirstTypeNotices
{
    get
    {
        return Notices.Where(n => n.Type == NoticeType.FirstType);
    }
}

... и привязывать к ним?

Возможно, вам придется подключитьвплоть до события Notices.CollectionChanged и инициировать события PropertyChanged для каждого из двух свойств.

0 голосов
/ 01 июля 2010

Я не совсем уверен, что вы спрашиваете, но я думаю, что вам, скорее всего, нужно использовать интерфейс IValueConverter.Вы объявляете новый класс, реализующий интерфейс IValueConverter, и реализуете методы Convert и ConvertBack следующим образом

public Converter implements IValueConverter{
      Object Convert(value, targetType, parameter, culture){
            // 'value' has the bound value from the xaml
            // do some converting and return the result
      }
      Object Convert(value, targetType, parameter, culture){
            // you can figure this one out, usually used for a two-way relationship
      }

}

В xaml вам необходим ResourceDictionary в вашем xaml с чем-то вроде

xmlns:y="clr-namespace:NamespaceWithClass">
<y:Converter x:Key="someName" />

И укажите этот конвертер в вашем контроле

<TextBox Text="{Binding Content, Converter={StaticResource someName}}" >           
            </TextBox>  

Не уверен, что это именно то, что вы ищете, но я надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...