创建可重用的RadioButtonGroupView控件



我已经成功地获得了一个单选按钮组功能,用于以下XAML:

<ScrollView>
<ListView ItemsSource="{Binding Devices}"
Style="{StaticResource ListViewSimpleStyle}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell x:DataType="local:DeviceEntryModel">
<RadioButton IsChecked="{Binding IsChecked, Mode=TwoWay}"
GroupName="Devices">
<RadioButton.Content>
<Label BindingContext="{Binding Source={RelativeSource AncestorType={x:Type RadioButton}}, Path=BindingContext}"
Text="{Binding Name}"
IsEnabled="{Binding Source={RelativeSource AncestorType={x:Type RadioButton}}, Path=IsEnabled}" />
</RadioButton.Content>
</RadioButton>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ScrollView>

有什么方法可以简化它并使其更易于重用吗?我正在考虑和最终结果看起来像这样:

<RadioButtonGroupView ItemSource="{Binding Devices}">
<RadioButtonGroupView.ItemTemplate>
<RadioButton IsChecked="{Binding IsChecked, Mode=TwoWay}"
x:DataType="local:Device"
GroupName="Devices">
<Label BindingContext="{Binding Source={RelativeSource AncestorType={x:Type RadioButton}}, Path=BindingContext}"
Text="{Binding Name}"
IsEnabled="{Binding Source={RelativeSource AncestorType={x:Type RadioButton}}, Path=IsEnabled}" />
</RadioButton>
</RadioButtonGroupView.ItemTemplate>
</RadioButtonGroupView>

一些类似的东西,一些更简单的东西,你明白要点了。谢谢!

我尝试了一些带有可绑定属性的东西,但不确定这是正确的方法。

是的,如果你想重用控件,你可以创建一个相对于BindablePropertyContentView

下面是一个示例代码:

ChildView.xaml

<?xml version="1.0" encoding="utf-8" ?> 
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiContentViewApp.ChildView"
x:Name="TestControlView"
>
<VerticalStackLayout>
<Label   Text="{Binding Source={x:Reference TestControlView}, Path=YourName}"
VerticalOptions="Center" 
HorizontalOptions="Center" />

<ListView ItemsSource="{Binding Source={x:Reference TestControlView}, Path=myViewModel.Items }" HasUnevenRows="True" >
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding FileName}" TextColor="#f35e20"  VerticalOptions="Center"/>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</VerticalStackLayout>
</ContentView>

ChildView.xaml.cs

public partial class ChildView : ContentView 
{
public String YourName
{
get
{
String value = (String)GetValue(YourNameProperty);
return value;
}
set
{
SetValue(YourNameProperty, value);
}
}
public static readonly BindableProperty YourNameProperty = BindableProperty.Create(nameof(YourName)
, typeof(String)
, typeof(ChildView), defaultBindingMode: BindingMode.TwoWay, propertyChanged: OnYourNameChanged);
static void OnYourNameChanged(BindableObject bindable, object oldValue, object newValue)
{
Console.WriteLine("-----------------> " + newValue);
}

//add MyViewModelProperty
public static readonly BindableProperty myViewModelProperty =
BindableProperty.Create(
nameof(myViewModel),
typeof(MyViewModel),
typeof(ChildView),
null);
public MyViewModel myViewModel
{
set { SetValue(myViewModelProperty, value); }
get { return (MyViewModel)GetValue(myViewModelProperty); }
}

public ChildView()
      {
            InitializeComponent();
      }
}

更多细节,你可以检查线程我想从两个不同的视图绑定数据。

您可以查看文档BindableProperty获取更多信息。

您需要XAML和。cs部件。

在XAML中,你定义了你的ControlTemplate。把所有UI放在那里,或者使用TemplatedParent作为源,或者指定使用TemplateBinding。

在。cs中,您创建控件的核心,继承ContentView,并编写您在XAML中使用的所有BindableProperties。(我假设Value和ItemSource是最小值)。

但是,我想让你考虑一下。如果你的模型是"Device",那么你的控件的可重用性应该如何?例如,如果你有一个让你从设备列表中选择的弹出窗口,在大多数情况下,弹出窗口是你可重用的部分,而不是单选按钮组。

只是当你做设计选择时需要考虑的东西。但是,没有什么可以阻止您创建自定义控件。

相关内容

  • 没有找到相关文章

最新更新