ThabetMicrosoft Ответов: 1

Как я могу привязать canvas к observablecollection WPF


Я создал полосу прокрутки в нижней части окна,

чтобы прокрутить простой текст, написанный вручную, он хорошо работает

Но я хочу прокрутить список элементов из моей базы данных, я делаю привязку к ObservableCollection.. но у меня нет возврата моего ItemSource... У меня есть ответ :

(Коллекция)

в полосе прокрутки !

код XAML:

<Window x:Class="WPFAuthentification.Views.NewUserView"

           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        

           Title="NewUserView" Height="500" Width="800" Icon="../Images/fuelSoft.png">
		 <Grid Background="White" VerticalAlignment="Top" HorizontalAlignment="Center">   
		   //....
		   
		    <Canvas Background="White" Margin="-717,-281,151,63" Grid.ColumnSpan="4" >
               <Canvas Canvas.Top="572" ClipToBounds="True" Name="canMain" Background="LightGray" 

			     Canvas.Left="614" Loaded="canMain_Loaded"  >
                   <TextBlock  Text="{Binding RoleList}"  FontSize="25" Name="tbmarquee" Canvas.Top="25" Width="1346" 

                             RenderTransformOrigin="0.465,0.524" />
                
                </Canvas>         
           
           </Canvas>      
        
         </Grid>
    </Window>


XAML-код.в CS:

public NewUserView()
       {
           InitializeComponent();
       }

            private void canMain_Loaded(object sender, RoutedEventArgs e)
       {
           DoubleAnimation doubleAnimation = new DoubleAnimation();
           doubleAnimation.From = -tbmarquee.ActualWidth;
           doubleAnimation.To = canMain.ActualWidth;
           doubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
           doubleAnimation.Duration = new Duration(TimeSpan.Parse("0:0:18"));
           tbmarquee.BeginAnimation(Canvas.LeftProperty, doubleAnimation);
       }


Что я уже пробовал:

the ViewModel:

public NewUserViewModel(int userId)
        {
		    //....
		}
            if
         private ObservableCollection<UserRoleClass> roleList;
         public ObservableCollection<UserRoleClass> RoleList
          {
            get { return roleList; }
            set
            {
                roleList = value;
                OnPropertyChanged("RoleList");
            }
          }

1 Ответов

Рейтинг:
2

TheRealSteveJudge

Я не знаю, как определяется ваш список ролей.

Может быть, этот пример может привести вас в правильном направлении:

public class Role
{
   public string Name { get; set; }
   public string Type { get; set; }
}

И ваша ObservableCollection определяется следующим образом
private ObservableCollection<Role> roleList;

public ObservableCollection<Role> RoleList
{
    get { return roleList; }
    set
    {
        if (roleList == value) return;

        roleList = value;

        OnPropertyChanged();
    }
}

Затем вы можете отобразить свою коллекцию в списке.
Вы должны использовать DataTemplate.
<ListBox ItemsSource="{Binding RoleList}">
	<ListBox.ItemTemplate>
	    <DataTemplate>
	        <Grid>
		    <Grid.ColumnDefinitions>
			<ColumnDefinition></ColumnDefinition>
			<ColumnDefinition></ColumnDefinition>
		    </Grid.ColumnDefinitions>
		    <TextBlock Text="{Binding Name}"></TextBlock>
		    <TextBlock Grid.Column="1" Text="{Binding Type}"></TextBlock>
		</Grid>
	    </DataTemplate>
	</ListBox.ItemTemplate>
</ListBox>

Один только текстовый блок не может отображать коллекцию.

Лучше было бы использовать DataGrid.
<DataGrid ItemsSource="{Binding RoleList}"
                      AutoGenerateColumns="False"
                      HeadersVisibility="Column"                 
                      CanUserAddRows="False">
	<DataGrid.Columns>
		<DataGridTemplateColumn>
			<DataGridTemplateColumn.HeaderTemplate>
				<DataTemplate>
					<TextBlock Text="Name"></TextBlock>
				</DataTemplate>
			</DataGridTemplateColumn.HeaderTemplate>
			<DataGridTemplateColumn.CellTemplate>
				<DataTemplate>
					<TextBlock Text="{Binding Name}"></TextBlock>
				</DataTemplate>
			</DataGridTemplateColumn.CellTemplate>
		</DataGridTemplateColumn>
		<DataGridTemplateColumn Width="*">
			<DataGridTemplateColumn.HeaderTemplate>
				<DataTemplate>
					<TextBlock Text="Type"></TextBlock>
				</DataTemplate>
			</DataGridTemplateColumn.HeaderTemplate>
			<DataGridTemplateColumn.CellTemplate>
				<DataTemplate>
					<TextBlock Text="{Binding Type}"></TextBlock>
				</DataTemplate>
			</DataGridTemplateColumn.CellTemplate>
		</DataGridTemplateColumn>
	</DataGrid.Columns>
</DataGrid>

Если вы хотите иметь что-то вроде новостного тикера, вам нужен конвертер значений
для вашего оригинального решения холста.
namespace WpfApplicationTest1.Converters
{
    public class ListConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var roles = value as ObservableCollection<Role>;

            if (roles != null)
            {
                var stringBuilder = new StringBuilder();

                foreach (var role in roles)
                {
                    stringBuilder.Append($"{role.Name} {role.Type}");
                }

                return stringBuilder.ToString();
            }

            return null;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

По вашему мнению, вы должны использовать конвертер значений следующим образом.
Добавьте это в раздел пространства имен вашего окна:
xmlns:local="clr-namespace:WpfApplicationTest1"

<TextBlock  Text="{Binding RoleList, Converter={StaticResource ListConverter}}"  FontSize="25" Name="tbmarquee" Canvas.Top="25" Width="1346" 
                             RenderTransformOrigin="0.465,0.524" />


ThabetMicrosoft

Танск для вас ответ,

Мне очень жаль, если мой пост не совсем ясен.

На самом деле, да, именно так, у меня есть коллекция элементов, которые я помещаю в них оба с помощью полосы прокрутки, чтобы прокрутить ее, показывая один или несколько элементов одновременно (5 или 10 одновременно)

На самом деле я хочу, чтобы объекты из коллекции прокручивались на холсте (или, если есть другие предложения лучше, чем холст), как полоса прокрутки новостей в CNN или SkyNews ...

Я попробовал простой текст (не элемент из коллекции) , и он хорошо прокручивается на холсте :

Для написания вручную текста все в порядке, это прокрутка, но для элементов из коллекции я не знаю, как это сделать? Есть предложения?

Спасибо,

TheRealSteveJudge

Может быть, Датагрид - это то, что вам нужно.
Он также показывает вертикальную полосу прокрутки, если это необходимо.
Пожалуйста, смотрите обновленное решение.

ThabetMicrosoft

Большое спасибо за вашу помощь,

может быть, Датагрид - это другой выбор..Но могу ли я сделать прокрутку с этим форматом:

Имя : Тип * * * Имя : Тип * * * Имя : Тип (с прокруткой)

Надеюсь, вы понимаете мой объектив?
пожалуйста, посоветуйте мне правильный выбор или приблизительный для него

TheRealSteveJudge

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

ThabetMicrosoft

да ! что это именно который я хочу..
Любое предложение сделать это с привязкой к Observblecollection

TheRealSteveJudge

Хотите ли вы объединить все элементы ObservableCollection только в одну строку?

ThabetMicrosoft

На самом деле у меня в классе есть два столбца: Message и Datetime,
и я хочу прокрутить per exemple 5 из таблицы в таком формате:

Message1: DateTile1 * * * Message2: DateTile2 *** Message2: DateTile2 ..

Да, чтобы сделать все эти элементы только одной строкой ,
( string =string1 + string2+string3) (string1: Message1: DateTile1 ***; ...)

TheRealSteveJudge

Пожалуйста, взгляните на обновленное решение.

ThabetMicrosoft

Большое спасибо за вашу попытку,
но извини, что я обманулся .. Я не недооцениваю ваш код обновления..

во-первых, нам не нужна Датагрид ?
код : описание:местная="среды CLR-пространство имен:WpfApplicationTest1" это в мой файл XMAL, я префиксом xmlns:местные="среды CLR-пространство имен:WPFAuthentification.HelperClasses"


И у меня есть Eroor в ligne : stringBuilder.Функции append($"{роль.имя} {роль.идентификатор}");

TheRealSteveJudge

Не сдавайся. Просто попробуйте мой предложенный код.

ThabetMicrosoft

да, я стараюсь ..К сожалению в ListConverter общественных классов : в разделе ivalueconverter {...}
это в XAML. cs или в ViewModel?

TheRealSteveJudge

Это собственный класс с именем ListConverter.cs в подпапках конвертеров.
Поэтому он имеет пространство имен WpfApplicationTest1.Конвертеры

Может быть, ты попробуешь что-нибудь другое.
Я только что нашел здесь: http://www.jarloo.com/rumormill4/

Это проект новостей.

ThabetMicrosoft

ладно, хорошо, я понимаю..Это очень хороший проект. Я постараюсь, как это для начала

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

TheRealSteveJudge

Пожалуйста.

ThabetMicrosoft

** У меня есть ошибка : "impoosible to reeolve The ListConverter "

может быть, проблема в ligne: xmlns:local= "clr-namespace:WpfApplicationTest1", потому что у меня есть для продвижения этого в моем XAML:
< Window x: Class= " Wpfauthentication.Вид.NewUserView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
описание:х="http://schemas.microsoft.com/winfx/2006/xaml"
описание:МС="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns: local= " clr-пространство имен:Wpfauthentication.HelperClasses"
....