【解決方法】windows.xaml から usercontrol.xaml に文字列を渡すにはどうすればよいですか

プログラミングQA


こんにちは、私はこの MainWindow.xaml 内に Mainwindow.Xaml(wpf フォーム) と 2x UserControl(EventPage.xaml および dashboard.xaml) を持っています。テキスト ボックスとボタンがあり、このコードを使用してフォーム (EventPage.Xaml) を切り替えます。このグリッド内の Dashboard.Xaml):

<Grid x:Name="myContainer">
                        <Local:EventPage x:Name="eventpage" Visibility="Collapsed"></Local:EventPage>
                        <Local:Dashboard x:Name="dashboard" Visibility="Collapsed"></Local:Dashboard>       
                    </Grid>

次のコードを使用して、textbox.text を Dashboard.Xaml に渡します。

public partial class MainWindow : Window
   {
       public string Searchtext;


       public MainWindow()
       {
           InitializeComponent();


       }
private void SearchBtn_Click(object sender, RoutedEventArgs e)
       {
           Searchtext = txtSearch.Text;
           Dashboard dashPage = new Dashboard(Searchtext);
       }

私の usercontrol.xaml(Dashboard.Xaml) には、 Searchtext を受信するための次のコードがあります。

public partial class Dashboard : UserControl
   {
       string searchtxt;

       public Dashboard(string searchtext)
       {
           InitializeComponent();

           searchtxt = searchtext;
       }

しかし、私はこの行の Mainwindows.xaml からこのエラーを受け取ります:

<Local:Dashboard x:Name="dashboard" Visibility="Collapsed"></Local:Dashboard>

最初のエラー: タイプ ‘Dashboard’ は、パブリックではないか、パブリックのパラメーターなしのコンストラクターまたは型コンバーターを定義していないため、オブジェクト要素として使用できません。
2 番目のエラー: タイプ ‘Dashboard’ は Name 属性を持つことはできません。デフォルト コンストラクターのない値タイプは、ResourceDictionary 内の項目として使用できます。

私が試したこと:

私は私のものを作ってみました

string Searchtext

として

Public string Searchtext

そして私は設定しました

x:FieldModifier="public"

Dashboard.xaml 内の DataGrid に挿入しましたが、どれも機能しませんでした:(

解決策 2

ユーザー コントロールのコンストラクターで文字列を渡そうとしているのはなぜですか? これは、UserControl を手動で初期化し、メイン ウィンドウに追加する場合 (ワンショット ディール) にのみ機能します。

UserControl は、UI 機能が含まれている単なるクラスであるため、同じ使用規則があります。

UserControl に値を渡す場合は、パブリック プロパティまたはメソッドを追加します。 次に、MainWindow から UserControl に値を渡すことができます – UserControl の存続期間中はいつでも。

ここにちょっとしたデモがあります。

注: これは、私が通常行う方法ではありません。 しかし、これは私があなたのために作ることができるのと同じくらい簡単だと思います.

MainWindow 2 つの UserControls があります。
* SearchWidget 検索入力機能を保持します
* DashboardWidget 検索を取得して適用します。

2 つのコントロールは、 MainWindow.

1. DashboardWidget ユーザーコントロール:

XML
<UserControl x:Class="WpfControlBasicsDemo.DashboardWidget"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
            <TextBlock x:Name="SearchText"
                       FontSize="32"
                       HorizontalAlignment="Center"
                       VerticalAlignment="Center"/>
    </Grid>
</UserControl>

および分離コード:

C#
public partial class DashboardWidget : UserControl
{
    public DashboardWidget()
    {
        InitializeComponent();
    }

    public void DoSearch(string searchText)
    {
        // do a search....
        SearchText.Text = searchText;
    }
}

検索テキストを取得してそれを処理するメソッドを公開しました。

2. SearchWidget ユーザーコントロール:

XML
<UserControl x:Class="WpfControlBasicsDemo.SearchWidget"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid Margin="10">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
        <Label Content="Search:"
               FontWeight="Bold"
               Margin="0 0 10 0"/>
        <TextBox Grid.Column="1"
                 x:Name="txtSearch" />
        <Button Grid.Column="2"
                Margin="10 0 0 0"
                Content="Search"
                Click="ButtonBase_OnClick"/>
    </Grid>
</UserControl>

および分離コード:

C#
public partial class SearchWidget : UserControl, INotifyPropertyChanged
{
    private string searchText;

    public SearchWidget()
    {
        InitializeComponent();
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        SearchText = txtSearch.Text;
    }

    public string SearchText
    {
        get => searchText;
        set
        {
            if (value == searchText) return;
            searchText = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler? PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

ここでは、次の 2 つのことを行います。
1. ボタンが押されたら、パブリック プロパティを設定します。
2. 公共財産は、 OnPropertyChanged イベント。

3. MainWindow

これにより、2 つの UserControls がホストされ、検索テキストが一方から他方に渡されます。

XML
<Window x:Class="WpfControlBasicsDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfControlBasicsDemo"
        mc:Ignorable="d" Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition/>
        </Grid.RowDefinitions>

        <local:SearchWidget x:Name="SearchWidget"/>
        <local:DashboardWidget x:Name="DashboardWidget" Grid.Row="1"/>
    </Grid>
</Window>

および分離コード:

C#
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        SearchWidget.PropertyChanged += SearchWidget_PropertyChanged;
    }

    private void SearchWidget_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        DashboardWidget.DoSearch(SearchWidget.SearchText);
    }
}

私は聞く PropertyChanged からのイベント SearchWidget UserControl を開き、テキストを DashboardWidget public メソッドによる UserControl DoSearch.

コメント

タイトルとURLをコピーしました