【问题标题】:Data binding controls in C# code (.cs file)C# 代码中的数据绑定控件(.cs 文件)
【发布时间】:2019-10-08 00:44:19
【问题描述】:

我一直在搜索数据绑定,但不是在 xaml 中,而是在 .cs 文件中搜索,是否有一种方式(属性)允许我将特定属性绑定到变量?

我想绑定“Entry”控件的“Text”属性,但问题是我该怎么做?

这是我尝试过的,但我不确定,因为很明显代码不正确

textBox.SetBinding(Entry.TextProperty, 
      "MainViewModel.GetInstance().SubtasksList[TaskNumber - 1]");

代码:

var textBox = new Entry()
{
           Placeholder = "ex Math homework",
   TextColor = Xamarin.Forms.Color.FromHex("#18E1BF"),
   HorizontalOptions = LayoutOptions.Center,
   VerticalOptions = LayoutOptions.Center,
   Text = MainViewModel.GetInstance().SubtasksList[TaskNumber - 1]
};

textBox.SetBinding(Entry.TextProperty, 
      "MainViewModel.GetInstance().SubtasksList[TaskNumber - 1]");

当我想从属性(列表索引)中获取数据时,它没有改变,为什么?

换句话说,我想做的是这样的:

<Entry
               Text="{Binding EntryText}”
               FontAttributes="Bold"
               FontSize="Large"
               HorizontalOptions="Center"
               VerticalOptions="CenterAndExpand" />

但不是 XAML 文件,而是使用 .cs 文件 我是怎么做到的?

【问题讨论】:

  • .GetInstance() 做什么?我认为 SubtasksList 不是可绑定的属性。
  • GetInstance() 是我的单吨赞助人的一部分,因此我通过它访问同一个实例并访问一个列表,该列表将通过我创建的整数类型的属性包含每个条目文本,该属性允许我索引列表实际上替换列表中每个条目上的文本的每个值,当我想查看列表的值时,我的问题就存在,换句话说,用户“输入”的条目,但是当我检查它时,列表中的所有元素仍然显示为空字符串,希望你能理解:/
  • 你的意思是你想绑定一个条目的文本属性(用户输入一个索引),然后另一个条目的文本显示索引的数据?
  • @LeoZhu-MSFT 不,我正在添加动态条目,但我希望每个“文本”条目属性都根据索引绑定到列表的元素
  • 可以吗?

标签: c# visual-studio xamarin xamarin.forms


【解决方案1】:

如果您希望将元素(基于索引)从 C# 集合绑定到 Entry,您可以这样做。

获取您的 ViewModel 实例并将其设置为页面上的 BindingContext

var viewModel = MainPageViewModel.GetInstace();
BindingContext = viewModel;

如果您有多个条目,请创建条目:

var textBox1 = new Entry()
{
    Placeholder = "ex Math homework",
    TextColor = Xamarin.Forms.Color.FromHex("#18E1BF"),
    HorizontalOptions = LayoutOptions.Center,
    VerticalOptions = LayoutOptions.Center
};

var textBox2 = new Entry()
{
    Placeholder = "ex Science homework",
    TextColor = Xamarin.Forms.Color.FromHex("#18E1BF"),
    HorizontalOptions = LayoutOptions.Center,
    VerticalOptions = LayoutOptions.Center
};

var textBox3 = new Entry()
{
    Placeholder = "ex English homework",
    TextColor = Xamarin.Forms.Color.FromHex("#18E1BF"),
    HorizontalOptions = LayoutOptions.Center,
    VerticalOptions = LayoutOptions.Center
};

设置绑定。对于这个例子,因为我没有得到TaskNumber 的意思,所以我使用的是固定索引

textBox1.SetBinding(Entry.TextProperty, "SubtasksList[0]");
textBox2.SetBinding(Entry.TextProperty, "SubtasksList[1]");
textBox3.SetBinding(Entry.TextProperty, "SubtasksList[2]");

然后您只需将您的条目添加到您的视图中。我正在使用StackLayout,我称之为ItemsContainer

ItemsContainer.Children.Add(textBox1);
ItemsContainer.Children.Add(textBox2);
ItemsContainer.Children.Add(textBox3);

上面的结果应该是这样的:

一个 Xamarin 页面,其中包含 3 个以编程方式创建的 Entries,每个都绑定到 C# 集合的一个项目。

希望这会有所帮助。-

【讨论】:

    【解决方案2】:

    我写了一个简单的示例,你可以检查它,如果它是你需要的,这里我通过 ListView 动态添加条目:

    页面 axml:

    <ContentPage>
     <ContentPage.Resources>
        <ResourceDictionary>
            <local:GetListConverter x:Key="getList" />
        </ResourceDictionary>
     </ContentPage.Resources>
    
     <StackLayout Padding="10, 0">
        <Entry x:Name="entry1"
               Text=""
               Placeholder="enter search term"
               VerticalOptions="CenterAndExpand" />
        <ListView ItemsSource="{Binding Source={x:Reference entry1},
                                    Path=Text,
                                    Converter={StaticResource getList}}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Entry Text="{Binding .}"></Entry>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
     </StackLayout>
    </ContentPage>  
    

    GetListConverter(通过用户输入索引的条目Text获取数据列表):

    public class GetListConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (string.IsNullOrEmpty((string)value))
            {
                return null;
            }
            ObservableCollection<string> dataList = MainViewModel.GetInstance().SubtasksList[int.Parse((string)value) - 1];
            return dataList;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    

    效果是这样的:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多