0

Sealed Partial クラスの関数から値を返すにはどうすればよいですか?

私はこのようにユーザーコントロールを使用します。リストである別のユーザーコントロールを呼び出すユーザーコントロールがあります。このリストから行を選択すると、SelectionChanged="RadGrid1_SelectedIndexChanged" が呼び出され、保存したい行を Templates 型の変数に保存します。(ここまでは問題ありません)

メインページでその変数にアクセスしようとすると、常に null が返されます。(ここで問題)

ユーザー コントロール:

<UserControl
x:Class="Stuff.Grouping.TableControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Stuff.Grouping"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">

<Grid>
    <SemanticZoom ScrollViewer.HorizontalScrollMode="Disabled" ScrollViewer.VerticalScrollMode="Disabled">
        <SemanticZoom.ZoomedInView>
            <local:GroupingZoomedInView Margin="0 0 30 50"/>
        </SemanticZoom.ZoomedInView>
        <SemanticZoom.ZoomedOutView>
            <GridView Margin="30 30 30 50">
                <GridView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapGrid Orientation="Horizontal" MaximumRowsOrColumns="7"/>
                    </ItemsPanelTemplate>
                </GridView.ItemsPanel>
                <GridView.ItemTemplate>
                    <DataTemplate>
                        <Border Background="#FF3399FF" MinWidth="100" MinHeight="100">
                            <TextBlock Text="{Binding}" FontSize="60" Margin="10"/>
                        </Border>
                    </DataTemplate>
                </GridView.ItemTemplate>
            </GridView>
        </SemanticZoom.ZoomedOutView>
    </SemanticZoom>
</Grid>
</UserControl>

GroupingZoomedInView.xaml

<UserControl
x:Class="Stuff.Grouping.GroupingZoomedInView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Stuff.Grouping.Data"
xmlns:telerikGrid="using:Telerik.UI.Xaml.Controls.Grid"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">

<Grid>
    <Grid.Resources>
        <local:PeopleViewModel x:Key="Model"/>
    </Grid.Resources>
    <telerikGrid:RadDataGrid x:Name="dataGrid" ItemsSource="{Binding Data,Source={StaticResource Model}}" AutoGenerateColumns="False" FontSize="{StaticResource ControlContentThemeFontSize}" SelectionChanged="RadGrid1_SelectedIndexChanged">
        <telerikGrid:RadDataGrid.GroupDescriptors>
            <telerikGrid:DelegateGroupDescriptor>
                <telerikGrid:DelegateGroupDescriptor.KeyLookup>
                    <local:AlpabeticGroupKeyLookup/>
                </telerikGrid:DelegateGroupDescriptor.KeyLookup>
            </telerikGrid:DelegateGroupDescriptor>
        </telerikGrid:RadDataGrid.GroupDescriptors>
        <telerikGrid:RadDataGrid.Columns>
            <telerikGrid:DataGridTextColumn PropertyName="Template"/>
            <telerikGrid:DataGridTextColumn PropertyName="data"/>
            <telerikGrid:DataGridTextColumn PropertyName="info"/>
            <telerikGrid:DataGridTextColumn PropertyName="score"/>
            <telerikGrid:DataGridTextColumn PropertyName="result"/>
            <telerikGrid:DataGridTextColumn PropertyName="repeats"/>
        </telerikGrid:RadDataGrid.Columns>
    </telerikGrid:RadDataGrid>
</Grid>
</UserControl>

GroupingZoomedInView.xaml.cs

public sealed partial class GroupingZoomedInView : UserControl, ISemanticZoomInformation
{
    public void RadGrid1_SelectedIndexChanged(object sender, DataGridSelectionChangedEventArgs e)
    {
        template = (Templates)dataGrid.SelectedItem;
    }

    public void StartViewChangeFrom(SemanticZoomLocation source, SemanticZoomLocation destination)
    {
        source.Item = this.dataGrid.GetDataView().Items.OfType<IDataGroup>().Select(c => c.Key);
    }

    public void StartViewChangeTo(SemanticZoomLocation source, SemanticZoomLocation destination)
    {
        var dataview = this.dataGrid.GetDataView();
        var group = dataview.Items.OfType<IDataGroup>().Where(c => c.Key.Equals(source.Item)).FirstOrDefault();

        var lastGroup = dataview.Items.Last() as IDataGroup;
        if (group != null && lastGroup != null)
        {
            this.dataGrid.ScrollItemIntoView(lastGroup.ChildItems[lastGroup.ChildItems.Count - 1], () =>
            {
                this.dataGrid.ScrollItemIntoView(group.ChildItems[0]);
            });
        }
    }

    public Func<Templates> GetTemplateMethod()
    {
        return () => this.template;
    }
}

ここでは、テンプレートの値を MainPage に返す必要があります。どうやってやるの?

public MainPage()
{
        GroupingZoomedInView gView = new GroupingZoomedInView();
        Func<Templates> method = gView.GetTemplateMethod();
        Templates temp = method();
 }

 public class Templates(){
    public String filename { get; set; }
    public String data { get; set; }
 }
4

1 に答える 1

3

クラスから値を「返す」ことはできません。それは関数にのみ適用されます。ただし、いくつかの方法でクラス内のデータにアクセスできます。

public フィールドを使用する(機能しますが、悪い習慣です)

public string template;

パブリック プロパティを使用する(より良い)

public string Template { get; set; }

パブリック メソッドを使用する

public string GetTemplate()
{
    return this.template;
}

ここにリストされている手法の場合、MainPageクラスでは、メソッドの本体内からのみテンプレート値にアクセスできます。

public class MainPage
{
    private GroupingZoomedInView gView;

    public void SomeMethod()
    {
        String temp = gView.GetTemplate();
    }
}

ところで、同じことがどの種類のクラスにも当てはまります。これがそうであるか、sealedまたはpartial違いがないという事実。


アップデート

コメントで、関数からメソッドを返したいと言っていました。その場合、上記の手法のいずれかを使用する必要がありますが、戻り値の型をstringto Func<string>(または、ここでは説明しないカスタム デリゲート型) に変更します。

メンバーメソッドから

private string GetTemplate() 
{
    return this.template;
}

public Func<string> GetTemplateMethod()
{
    return new Func<string>(this.GetTemplate);
}

ラムダ式から

private string template;

public Func<string> GetTemplateMethod()
{
    return () => this.template;
}

これらの手法のいずれかから、MainPageクラスでこのように使用できますGetTemplateMethod

public class MainPage
{
    private GroupingZoomedInView gView;

    public void SomeMethod()
    {
        Func<string> method = gView.GetTemplateMethod();
        string temp = method(); // executes the method
    }
}
于 2013-03-08T04:12:40.510 に答える