1

私は、XAML がバインドされているリソース データを含む C# クラスを持っている MVVM の緩やかな形式を持っています。このファイルは、MainWindow.xaml ファイルと App.xaml ファイルのアプリケーション レベルの 2 つの場所で参照されます。MainWindow コード ビハインドで参照を取得すると、インスタンスが 1 つしかないように見え、その 1 つのインスタンスに値を設定できます。値は、ウィンドウ レベルとアプリケーション レベルの両方で表示されます。誰でもこの仮定を確認または修正できますか? 以下の編集を参照してください

MainWindow と、MainWindow のバインドをサポートする MainWindowResource.cs ファイルがあります。リソース ファイルは次のようになります (短縮)。

public class MainWindowResource : INotifyPropertyChanged
{
    #region Data Members

    private Color _arrowBorderColor = Colors.Black;
    private Color _arrowColor = Colors.Black;
    private bool _viewFitYAxis = true;
    private string _viewFitYAxisTooltip = "";

    #endregion Data Members

    #region Properties

    public Color ArrowBorderColor
    {
        get { return _arrowBorderColor; }
        set { _arrowBorderColor = value; SetPropertyChanged("ArrowBorderColor"); }
    }

    public Color ArrowColor
    {
        get { return _arrowColor; }
        set { _arrowColor = value; SetPropertyChanged("ArrowColor"); }
    }

    public bool ViewFitYAxis
    {
        get { return _viewFitYAxis; }
        set { _viewFitYAxis = value; SetPropertyChanged("ViewFitYAxis"); }
    }

    public string ViewFitYAxisTooltip
    {
        get { return _viewFitYAxisTooltip; }
        set { _viewFitYAxisTooltip = value; SetPropertyChanged("ViewFitYAxisTooltip"); }
    }

    #endregion Properties

    #region INotifyPropertyChanged implementation

    public event PropertyChangedEventHandler PropertyChanged;
    private void SetPropertyChanged(string prop)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }

    #endregion INotifyPropertyChanged implementation
}

MainWindow XAML で MainWindowResouce ファイルを参照します。

<Window.Resources>
    <c:MainWindowResource x:Key="MainWindowResource"/>

そして、MainWindow XAML 内の MainWindowResource のプロパティにバインドします。

<MenuItem x:Name="MenuFitYAxis"
    Header="Fit _Y Axis"
    IsCheckable="True"
    IsChecked="{Binding Source={StaticResource MainWindowResource}, Path=ViewFitYAxis}"
    ToolTip="{Binding Source={StaticResource MainWindowResource}, Path=ViewFitYAxisTooltip}"
    Click="MenuItem_Click_ViewFitYAxis"/>

また、ArrowResources.xaml という名前のリソース ディクショナリもあり、そこでいくつかの矢印パスを定義しています。また、いくつかの値を MainWindowResource ファイルに外部化したいので、次のようにします (短縮):

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:c="clr-namespace:UserInterface">
    <c:MainWindowResource x:Key="MainWindowResource"/>

    <Path x:Key="ArrowCounter"
        Stroke="{Binding Source={StaticResource MainWindowResource}, Path=ArrowBorderColor}"
        StrokeThickness="1"
        Data="M 8,26 L 14,20 L 10,20 A 10,10 0 1 1 30,20 L 34,20 A 14,14 0 1 0 6,20 L 2,20 Z">
        <Path.Fill>
            <RadialGradientBrush GradientOrigin="0.15,0.2" Center="0.3,0.4">
                <GradientStop Color="White"
                    Offset="0"/>
                <GradientStop Color="{Binding Source={StaticResource MainWindowResource}, Path=ArrowColor}"
                    Offset="1"/>
            </RadialGradientBrush>
        </Path.Fill>
    </Path>

</ResourceDictionary>

リソース ディクショナリは、次のように App.xaml に含まれています。

<Application x:Class="UserInterface.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary Source="ArrowResources.xaml"/>
    </Application.Resources>
</Application>

MainWindow のコード ビハインドで、次のように MainWindowResource クラスへの参照を取得します (短縮):

public partial class MainWindow : Window
{
    private MainWindowResource _mainWindowResource = null;
    public MainWindow()
    {
        InitializeComponent();

        // get a reference to the binding sources so we can set the properties
        _mainWindowResource = (MainWindowResource)this.Resources["MainWindowResource"];
    }
}

この参照を取得すると、MainWindowResource クラスのインスタンスが 1 つしかないように見えます。値を設定すると、それらの変更はアプリケーション レベルで MainWindow.xaml と ArrowResources.xaml の両方に反映されます。

誰かがこれを確認したり、私の仮定を修正したりできますか?

編集

私は間違っていた。ArrowResources.xaml には MainWindowResource.cs の値が表示されますが、MainWindow コード ビハインド内でクラスのインスタンスを取得して矢印の値を変更すると、矢印のパスは変更を認識しないため、変更してはなりません。同じインスタンスになります。

矢印用に別のクラス ファイルを作成しようとしましたが、次のように MainWindow のコード ビハインドでそのクラスのインスタンスを取得しました。

    private MainWindowResource _mainWindowResource = null;
    private ArrowResource _arrowResource = null;
. . .
        _mainWindowResource = (MainWindowResource)this.Resources["MainWindowResource"];
        _arrowResource = (ArrowResource)Application.Current.Resources["ArrowResource"];

しかし、ArrowResource クラス ( ArrowResources.xaml のリソース ディクショナリのバッキング クラス) の値を変更しようとすると、値を変更できましたが、それでも矢印パスに反映されませんでした。

コードビハインドからこれらの値を変更する方法を知っている人はいますか?

4

1 に答える 1